使用python(pandas)对CSV文件进行条件合并

2024-10-01 07:27:10 发布

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

我正在尝试合并具有相同架构的>=2文件。
文件将包含重复的条目,但行将不相同,例如:

file1:
store_id,address,phone
9191,9827 Park st,999999999
8181,543 Hello st,1111111111

file2:
store_id,address,phone
9191,9827 Park st Apt82,999999999
7171,912 John st,87282728282

Expected output:
9191,9827 Park st Apt82,999999999
8181,543 Hello st,1111111111
7171,912 John st,87282728282

如果您注意到: 9191,9827 Park st,999999999 and 9191,9827 Park st Apt82,999999999基于商店标识和电话号码是相似的,但是我从文件2中选择了它,因为地址更具描述性。在

store_id+phone_number是我查找位置和查找重复项的复合主键(store_id足够在上面的示例中找到它,但我需要一个基于多个列值的键)

问题:
-我需要合并具有相同架构但有重复行的多个CSV文件。
-其中,行级合并应该具有根据行的值选择行的特定值的逻辑。就像从文件1中提取的电话和从文件2中提取的地址。
-一个或多个列值的组合将定义行是否重复。在

用熊猫能做到这一点吗?在


Tags: 文件storeidparkhelloaddress架构地址
2条回答

将它们组合在一起的一种方法是使用merge(在store_id和number上,如果这些是索引,那么这将是一个join而不是merge):

In [11]: res = df1.merge(df2, on=['store_id', 'phone'], how='outer')

In [12]: res
Out[12]:
   store_id     address_x        phone           address_y
0      9191  9827 Park st    999999999  9827 Park st Apt82
1      8181  543 Hello st   1111111111                 NaN
2      7171           NaN  87282728282         912 John st

然后,您可以使用^{}来选择address_y,否则{}:

^{pr2}$

不如使用concatgroupbyagg,然后编写一个agg函数来选择正确的值:

import pandas as pd
import io

t1 = """store_id,address,phone
9191,9827 Park st,999999999
8181,543 Hello st,1111111111"""

t2 = """store_id,address,phone
9191,9827 Park st Apt82,999999999
7171,912 John st,87282728282"""

df1 = pd.read_csv(io.BytesIO(t1))
df2 = pd.read_csv(io.BytesIO(t2))

df = pd.concat([df1, df2]).reset_index(drop=True)

def f(s):
    loc = s.str.len().idxmax()
    return s[loc]

df.groupby(["store_id", "phone"]).agg(f)

相关问题 更多 >