添加一个熊猫df列,该列将另一个df

时间:2019-10-16 16:18:32

标签: python pandas dataframe

我正在尝试在pandas数据框中创建一个新列,以将来自另一个符合特定条件的数据框中的值连接起来。

如果我有数据框库存和产品作为输入:

Inventory

Category    All_SKU
Apple       NaN
Banana      NaN
Oranges     NaN


Products

Product       Category     SKU
Macintosh     Apple        4123
Gala          Apple        4356
Navel         Oranges      5897
Cara Cara     Oranges      5324
Red Delicious Apple        4896
Cavendish     Banana       7895

我希望输出为

Inventory

Category    All_SKU
Apple       4123; 4356; 4896
Oranges     5897; 5324
Banana      7895

我已经尝试过这种方法(和其他方法),但是遇到一个关键错误。不知道这是最好的方法还是有更好的方法来解决这个问题。

for row in Products.index:
  InvRow=Inventory.index[Inventory['Category'] == Products['Category',row]]
  Inventory['All_SKU',InvRow]=Inventory['All_SKU',InvRow] + "; "+  Products['SKU',row]

4 个答案:

答案 0 :(得分:0)

类似的事情应该做

Products.groupby('Category').SKU.apply(lambda x: ';'.join(list(str(i) for i in list(x))))

enter image description here

但是如果我是你,我会使用列表而不是字符串

答案 1 :(得分:0)

您可以使用分组方式,如下所示

df = pd.DataFrame([['Macintosh', 'Apple', '4123'], ['Gala', 'Apple', '4356'], ['Navel', 'Oranges', '5897'], ['Cara Cara', 'Oranges', '5324'], ['Red Delicious', 'Apple', '4896'], ['Cavendish', 'Banana', '7895']], columns=('Product', 'Category', 'SKU'))
result = df.groupby("Category")["SKU"].apply(list).str.join(";")

如果您希望将结果限制为库存数据表中的类别,则可以使用如下所示的合并

df_inventory.merge(df, on="Category")

答案 2 :(得分:0)

一个简单易懂的解决方案,适合像我这样的人,他们不会得到lambda和其他很酷的一线解决方案。

for d in Inventory['Category'].index:
    cat= data['Category'][d]
    data = Products.query(f"Category == '{cat}'", inplace = False) 
    t = data['SKU']
    Inventory['All_SKU'][d] = t.tolist()

(我将它们存储为列表,而不是';'分隔的字符串。)

答案 3 :(得分:0)

您可以使用groupby.apply + Series.map

Inventory['All_SKU']=( Inventory['Category']
                       .map(products[products['Category'].isin(Inventory['Category'])]
                       .groupby('Category')['SKU']
                       .apply(lambda x: ','.join(x.astype(str)))) )
print(Inventory)

  Category         All_SKU
0    Apple  4123,4356,4896
1   Banana            7895
2  Oranges       5897,5324