数据错误使用函数和groupby来联合pandas dataframe

时间:2017-10-29 08:17:07

标签: python string pandas concatenation pandas-groupby

我有一个以下结构的数据框:

是myDF:

    Entry   Address         ShortOrdDesc
0   988     Fake Address 1  SC_M_W_3_1
1   989     Fake Address 2  SC_M_W_3_3
2   992     Fake Address 3  nan_2
3   992                     SC_M_G_1_1
4   992                     SC_M_O_1_1

要在此df上完成工作,要将行与相同的条目组合在一起。对于这些,只有第一行有地址。我需要连接 ShortOrdDesc 列和地址。我发现了一个非常有用的链接:

Pandas groupby: How to get a union of strings

通过这项工作,我开发了以下功能:

def f(x):
     return pd.Series(dict(A = x['Entry'].sum(), 
                        B = x['Address'].sum(), 
                        C = "%s" % '; '.join(x['ShortOrdDesc'])))

使用

应用
myobj = ordersToprint.groupby('Entry').apply(f)

这将返回错误:

  

TypeError:必须是str,而不是int

查看我的数据我看不出是什么问题,因为在“Entry”的整数上运行 .sum()应该可以正常工作。

我的代码或方法有什么错误?

1 个答案:

答案 0 :(得分:1)

我认为某些列是数字的,需要string

所以请使用astype,如果需要删除NaN,请添加dropna

def f(x):
 return pd.Series(dict(A = x['Entry'].sum(), 
                    B = ''.join(x['Address'].dropna().astype(str)), 
                    C = '; '.join(x['ShortOrdDesc'].astype(str))))

myobj = ordersToprint.groupby('Entry').apply(f)
print (myobj)
          A               B                              C
Entry                                                     
988     988  Fake Address 1                     SC_M_W_3_1
989     989  Fake Address 2                     SC_M_W_3_3
992    2976  Fake Address 3  nan_2; SC_M_G_1_1; SC_M_O_1_1

使用agg的另一个解决方案,但是必须重命名列:

f = {'Entry':'sum', 
      'Address' : lambda x: ''.join(x.dropna().astype(str)), 
      'ShortOrdDesc' : lambda x: '; '.join(x.astype(str))}
cols = {'Entry':'A','Address':'B','ShortOrdDesc':'C'}
myobj = ordersToprint.groupby('Entry').agg(f).rename(columns=cols)[['A','B','C']]
print (myobj)
          A               B                              C
Entry                                                     
988     988  Fake Address 1                     SC_M_W_3_1
989     989  Fake Address 2                     SC_M_W_3_3
992    2976  Fake Address 3  nan_2; SC_M_G_1_1; SC_M_O_1_1