如何比较两个pandas数据帧并删除一个文件中的重复项而不附加来自其他fi的数据

2024-09-24 06:24:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用pandas数据帧比较两个csv文件。一个是一个主表,它每天都将数据附加到它上面(测试_主.csv). 第二个是每日报告(测试_每日.csv)包含我想附加到测试的数据_主.csv. 在

我从这些文件创建了两个pandas数据帧:

import pandas as pd

dfmaster = pd.read_csv(test_master.csv)
dfdaily = pd.read_csv(test_daily.csv)

我希望将每日列表与主列表进行比较,以查看每日列表中是否存在已在主列表中的重复行。如果是这样,我希望他们从dfdaily中删除重复项。然后我想将这个非重复数据写入dfmaster。在

重复数据将始终是整行。我的计划是一行一行地遍历这些工作表来进行比较。在

我意识到我可以将我的日常数据附加到dfmaster数据帧中,并使用drop\u duplicates删除重复项。但是,我无法找出如何删除dfdaily数据帧中的重复项。我需要能够写回dfdaily数据进行测试_每日.csv(或另一个新文件)没有重复数据。在

下面是一个数据帧的示例。在

试验_主.csv在

^{pr2}$

试验_每日.csv在

+-------------+-------------+-------------+
|  column 1   |  column 2   |  column 3   |
+-------------+-------------+-------------+
| duplicate 1 | duplicate 1 | duplicate 1 |
| duplicate 2 | duplicate 2 | duplicate 2 |
| 10          | 11          | 12          |
| 13          | 14          | 15          |
+-------------+-------------+-------------+

期望输出为:

试验_主.csv在

+-------------+-------------+-------------+
|  column 1   |  column 2   |  column 3   |
+-------------+-------------+-------------+
| 1           | 2           | 3           |
| 4           | 5           | 6           |
| 7           | 8           | 9           |
| duplicate 1 | duplicate 1 | duplicate 1 |
| duplicate 2 | duplicate 2 | duplicate 2 |
| 10          | 11          | 12          |
| 13          | 14          | 15          |
+-------------+-------------+-------------+

试验_每日.csv在

+----------+----------+----------+
| column 1 | column 2 | column 3 |
+----------+----------+----------+
|       10 |       11 |       12 |
|       13 |       14 |       15 |
+----------+----------+----------+

任何帮助将不胜感激!在

编辑

我错误地认为set difference问题的解决方案解决了我的问题。我遇到了一些这样的解决方案不起作用的案例。我相信这与特洛伊D在下面的评论中提到的指数标签有关。特洛伊D的解决方案就是我现在使用的解决方案。在


Tags: 文件csv数据testpandas列表readcolumn
1条回答
网友
1楼 · 发布于 2024-09-24 06:24:02

试试这个:

我将2个索引装箱,然后将第2-4行设置为重复:

import numpy as np

test_master = pd.DataFrame(np.random.rand(3, 3), columns=['A', 'B', 'C'])
test_daily = pd.DataFrame(np.random.rand(5, 3), columns=['A', 'B', 'C'])
test_daily.iloc[1:4] = test_master[:3].values

print(test_master)
print(test_daily)

输出:

^{pr2}$

然后,添加一个多索引级别以标识哪些数据来自哪个数据帧:

test_master['master'] = 'master'
test_master.set_index('master', append=True, inplace=True)
test_daily['daily'] = 'daily'
test_daily.set_index('daily', append=True, inplace=True)

现在按照您的建议合并并删除重复项:

merged = test_master.append(test_daily)
merged = merged.drop_duplicates().sort_index()
print(merged)

输出:

             A         B         C
  master                              
0 daily   0.643062  0.335643  0.215443
  master  0.009322  0.330057  0.082956
1 master  0.197500  0.010593  0.356774
2 master  0.147410  0.697779  0.421207
4 daily   0.973867  0.873358  0.502973

在这里,您可以看到组合的数据帧,其中的数据源标记在索引中。现在只需对每日数据进行切片:

idx = pd.IndexSlice
print(merged.loc[idx[:, 'daily'], :])

输出:

             A         B         C
  master                              
0 daily   0.643062  0.335643  0.215443
4 daily   0.973867  0.873358  0.502973

相关问题 更多 >