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

时间:2013-11-19 00:04:49

标签: python csv pandas data-processing

我正在尝试将>=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基于store_id和phone类似,但我从file2中选择了它,因为地址更具描述性。

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

问题:
- 我需要合并多个具有相同模式但具有重复行的CSV文件 - 行级别合并应具有根据其值选择行的特定值的逻辑。就像从file1接收的电话和从file2接收的地址一样 - 1个或多个列值的组合将定义行是否重复。

这可以用熊猫来实现吗?

2 个答案:

答案 0 :(得分:0)

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

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

然后,您可以使用where选择address_y(如果存在),否则address_x

In [13]: res['address'] = res.address_y.where(res.address_y, res.address_x)

In [14]: del res['address_x'], res['address_y']

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

答案 1 :(得分:0)

如何使用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)