逗号分隔值与pandas GroupBy

时间:2017-12-26 15:09:43

标签: python pandas dataframe group-by pandas-groupby

我试图在连接值

时找出是否存在删除数据框中的重复项

示例:

df
   key  v1  v2
0  1   n/a  a
1  2   n/a  b
2  3   n/a  c
3  2   n/a  d
4  3   n/a  e

输出应该是:

 df_out
   key v1   v2
0  1   n/a  a
1  2   n/a  b,d
2  3   n/a  c,e

我尝试使用df.drop_duplicates()和一些循环来保存v2列值,但还没有。 我试图通过使用Pandas来完成它并使用out loop来完成它。

有人知道熊猫可以做到吗?

3 个答案:

答案 0 :(得分:3)

假设您有两列,这应该很简单。使用groupby + aggv1应汇总firstv2汇总','.join

df
   key  v1 v2
0    1 NaN  a
1    2 NaN  b
2    3 NaN  c
3    2 NaN  d
4    3 NaN  e

(df.groupby('key')
   .agg({'v1' : 'first', 'v2' : ','.join})
   .reset_index()
   .reindex(columns=df.columns))

   key  v1   v2
0    1 NaN    a
1    2 NaN  b,d
2    3 NaN  c,e

如果您有多个此类列需要相同的聚合,请构建名为f的聚合词典并将其传递给agg

答案 1 :(得分:1)

使用set

df.groupby('key').agg(lambda x : ','.join(set(x)))
Out[1255]: 
      v1   v2
key          
1    n/a    a
2    n/a  b,d
3    n/a  c,e

答案 2 :(得分:0)

使用apply

  

pandas.core.groupby.GroupBy.apply

     

GroupBy.apply(func,* args,** kwargs)[来源]

Apply function func group-wise and combine the results together.
df.groupby(["key", "v1"])["v2"].apply(list) # or apply(set) depending on your needs

输出:

key  v1
1    n/a       [a]
2    n/a    [b, d]
3    n/a    [c, e]
Name: v2, dtype: object