我有一个数据框:
密钥 | 名称 | 数量 | 状况 | 包装 |
---|---|---|---|---|
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
以下是代码操作:
-
向前填充空值:
df['Key'].fillna(method='ffill', inplace=True)
将使用上一行的值填充“键”列中的空值。 -
按“键”列分组:
df.groupby('Key')
按“键”列对数据框进行分组,以便我们可以聚合每个唯一键的行。 -
聚合列:
.agg({'Name': 'first', ...})
定义了我们如何聚合每个组中的列: -
'Name': 'first'
:对于“名称”列,我们采用第一个非空值。 -
'Amount': 'first'
:对于“金额”列,我们也采用第一个非空值。 -
'Condition': lambda x: ', '.join(x.unique())
:对于“状况”列,我们连接所有唯一值(删除重复项),并以逗号分隔。 -
'Packing': ', '.join
:对于“包装”列,我们使用逗号分隔符连接所有值。 -
重置索引:
reset_index()
将“键”列转换回常规列,并创建一个默认的数字索引。
然后,可以在将此数据加载到
QTableWidget
之前使用此处理后的数据框。