首页 > 编程问答 >Pandas:如果键列为空,则合并 2 行

Pandas:如果键列为空,则合并 2 行

时间:2024-08-01 15:47:14浏览次数:8  
标签:python pandas dataframe datatable

我有一个数据框:

密钥 名称 数量 状况 包装
A1 糖果A 25 25不错
B1 糖果 B 50 49 好
1 损坏
C1 糖果 C 40 40 好

我希望我的数据框是这样的:如果键列为空,则该行将被添加到带有键的最近的上行中。

名称 金额 条件| ||包装 A1
糖果A 25 25 不错 B1
糖果B 50 好,好 49 不错, 1 损坏 (整个空行将被删除)
C1
Candy C 40 40 不错 然后是最后,如果数据重复(好,好)我希望它只显示 1(好),

最终数据框:

密钥

名称 数量 条件 包装 A1
糖果 A 25 25 不错 B1
糖果 B 50 49 不错,1 个损坏 C1
糖果 C| ||40 40 不错 知道如何实现这一点吗? 编辑:

我从 .ods 文件导入了数据

然后我尝试了 fillna()| ||这就是我将数据显示到 QTableWidget 中的方式
I imported a data from a .ods file

            path = QFileDialog.getOpenFileName(self, 'Open ODS', os.getenv('HOME'), 'ODS(*.ods)')[0]
            all_data = pd.read_excel(path, skiprows=range(1, 6))
            if all_data.size == 0:
                return
            print(all_data)

and then I tried fillna()

            all_data.fillna('', inplace = True)
            self.main_screen_product_tableWidget.setRowCount(all_data.shape[0])
            self.main_screen_product_tableWidget.setColumnCount(all_data.shape[1])
            self.main_screen_product_tableWidget.setHorizontalHeaderLabels(["Key","Name",
            "Amount","Condition","Packing"])

This is how I show the data into QTableWidget

                for row in all_data.iterrows():
                    values = row[1]
                    for col_index, value in enumerate(values):
                        tableItem = QTableWidgetItem(str(value))
                        self.main_screen_product_tableWidget.setItem(row[0], 
                        col_index, tableItem)
                

这是一个逐步解决问题的 Pandas 方法:

import pandas as pd

# 示例数据框
df = pd.DataFrame({
    "Key": ["A1", "B1", "", "C1"],
    "Name": ["Candy A", "Candy B", "", "Candy C"],
    "Amount": [25, 50, "", 40],
    "Condition": ["Good", "Good", "Good", "Good"],
    "Packing": ["25 Good", "49 Good", "1 Damaged", "40 Good"]
})

# 向前填充“键”列中的空值
df['Key'].fillna(method='ffill', inplace=True)

# 按“键”列分组并将字符串列聚合在一起
df = df.groupby('Key').agg({
    "Name": 'first',
    "Amount": 'first',
    "Condition": lambda x: ', '.join(x.unique()),  # 如果重复则仅获取唯一条件
    "Packing": ', '.join
}).reset_index()

print(df)

这将给出以下输出:

  Key    Name  Amount Condition         Packing
0  A1  Candy A      25      Good        25 Good
1  B1  Candy B      50      Good  49 Good, 1 Damaged
2  C1  Candy C      40      Good        40 Good

以下是代码操作:

  1. 向前填充空值: df['Key'].fillna(method='ffill', inplace=True) 将使用上一行的值填充“键”列中的空值。
  2. 按“键”列分组: df.groupby('Key') 按“键”列对数据框进行分组,以便我们可以聚合每个唯一键的行。
  3. 聚合列: .agg({'Name': 'first', ...}) 定义了我们如何聚合每个组中的列:
  4. 'Name': 'first' :对于“名称”列,我们采用第一个非空值。
  5. 'Amount': 'first' :对于“金额”列,我们也采用第一个非空值。
  6. 'Condition': lambda x: ', '.join(x.unique()) :对于“状况”列,我们连接所有唯一值(删除重复项),并以逗号分隔。
  7. 'Packing': ', '.join :对于“包装”列,我们使用逗号分隔符连接所有值。
  8. 重置索引: reset_index() 将“键”列转换回常规列,并创建一个默认的数字索引。

然后,可以在将此数据加载到 QTableWidget 之前使用此处理后的数据框。

标签:python,pandas,dataframe,datatable
From: 78819711

相关文章

  • 用于从连接到 LAN 交换机的四个 Arduino 扩展板读取/保存数据的 Python 代码
    我有四个Arduino扩展板连接到LAN交换机。每个人都会发出一条“HelloJane”消息。LAN交换机已连接到我的PC。我需要将每个Arduino的数据/消息保存在PC上的单独文件夹中。请帮助使用Python脚本/代码。我能够看到来自所有四个Arduino的消息,但无法将它们保存到文......
  • 使用 Python 生产者和消费者在 Kubernetes minikube 上设置 Kafka Kraft
    我正在尝试从kubernetes集群外部连接到kubernetesminikubekafkapod。服务器启动没有任何问题,但我无法设法将本地kafka生产者/消费者连接到外部kafkapod。在集群内的kafka服务器映像上,我将bootstrap-server设置为:bin/kafka-topics.sh--create--bootst......
  • pandas 数据帧索引:to_list() 与 tolist()
    我最近为某人编写了一个python脚本,其中我使用to_list()将pandas数据帧的索引转换为列表。然而,这对他们不起作用,因为他们得到:AttributeError:'Index'objecthasnoattribute'to_list'使用他们的Python解释器。我做了一些搜索,发现还有tolist()......
  • python llama_index.indices.list.retrievers 导入错误
    fromllama_indeximportGPTListIndexfromllama_index.indices.list.retrieversimportListIndexLLMRetrieverdocuments=SimpleDirectoryReader('./data').load_data()index=GPTListIndex.from_documents(documents,service_context=service_context)r......
  • 如何使用 python 和 bs4 修复抓取 web 表输出 csv
    请帮帮我,,我想在“td”、“Barcode”和“namaproduk”中获取2个数据,但我得到的数据非常糟糕。我应该修复什么?importcsvimportrequestsfrombs4importBeautifulSoupoutfile=open("dataaa.csv","w",newline='')writer=csv.writer(outfile)page=0whilepag......
  • 基于Django的超市小程序+47822(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、APP、小
    基于django超市小程序摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,超市小程序被用户普遍使用,为方便用户能够可以随时进行超市小程序的数据信息管理,特开发了基于djan......
  • 【优秀python django系统案例】基于python的医院挂号管理系统,角色包括医生、患者、管
    随着信息技术的迅猛发展,传统的医院挂号管理方式面临着效率低下、排队时间长、信息不对称等诸多问题。这些问题不仅影响患者的就医体验,也加重了医院工作人员的负担。在此背景下,基于Python的医院挂号管理系统应运而生。该系统旨在通过信息化手段优化挂号流程,提高管理效率,提升医疗......
  • Python-PLAXIS自动化建模技术与典型岩土工程
    原文链接:Python-PLAXIS自动化建模技术与典型岩土工程https://blog.csdn.net/2301_78164062/article/details/140607885?spm=1001.2014.3001.5501一:Plaxis软件及PlaxisPythonAPI环境搭建1、Plaxis2D\Plaxis3D软件2、面向对象编程语言Python及其开发环境Spyder3、Plaxis输......
  • 在Conda环境中安装python内核
    我刚刚开始使用jupyter笔记本进行我的开发过程。我首先创建一个新的python环境:$condacreate-ntestenv然后激活它:$sourceactivatetestenv并安装python内核模块:$pipinstallipykernel现在,模糊性开始了。我只想专门为我的活动环境创建一个新内核。......
  • C++11 中的 python 海象运算符 (:=) 等效吗?
    最近我在Python中经常使用:=运算符,这样:ifmy_object:=SomeClass.function_that_returns_object():#dosomethingwiththisobjectifitexistsprint(my_object.some_attribute)问题有没有办法在c++11中做到这一点而不使用stdlib?例如......