将带有映射值的2个CSV文件合并到另一个以逗号分隔的文件中

时间:2018-03-14 09:56:19

标签: python pandas csv dataframe

这是我的问题:

我有两个csv文件如下:

Book1.csv

Id  Product
0   aaaa
1   bbbb
2   cccc
3   dddd

Book2.csv

Id  Attribute
0   aaad
0   sssd
1   fffd
1   gggd
1   cccd
2   bbbd
3   hhhd
3   bbbd

我希望合并上面的文件并获取输出文件:

Product Attributes
aaaa    aaad, sssd
bbbb    fffd, gggd, cccd
cccc    bbbd
dddd    hhhd, bbbd

我现在使用的代码是:

import pandas as pd

a = pd.read_csv("Book1.csv")
b = pd.read_csv("Book2.csv")
b = b.dropna(axis=0)
merged = a.merge(b, how='left', left_on='Id', right_on='Id' )
merged.rename(columns={
                 'Product': 'Product',
                 'Attribute': 'Attributes'}, inplace=True)
merged = merged[['Product','Attributes']]
merged.to_csv("output.csv", index=False)

我从中得到的是:

Product Attributes
aaaa    aaad
aaaa    sssd
bbbb    fffd
bbbb    gggd
bbbb    cccd
cccc    bbbd
dddd    hhhd
dddd    bbbd

正确合并所有属性和产品。但我想要的是将Attibutes合并为一个字符串并用逗号分隔(不是逐行)。我该怎么做呢?提前谢谢!

1 个答案:

答案 0 :(得分:2)

这是一种方式。

g = df2.groupby('Id')['Attribute'].apply(', '.join)
df1['Attributes'] = df1['Id'].map(g)

<强>结果

   Id Product          Attributes
0   0    aaaa          aaad, sssd
1   1    bbbb    fffd, gggd, cccd
2   2    cccc                bbbd
3   3    dddd          hhhd, bbbd

如果您只想合并到list,您可以使用它,但它不会很好地打印出来:

g = df2.groupby('Id')['Attribute'].apply(list)

<强>解释

  • 按ID分组df2属性,列出汇总。
  • 通过df1映射到pd.Series.map中的列。