在表中连接列值 - pandas

时间:2017-09-19 09:56:25

标签: python pandas

我的表格如下

mark     name total  point
 70     bala   100    10
 80     bala   100    10
 80     bala   100    10
100  karthik   100     5
100  karthik   150     5
100  karthik   150     5
50     abdul   80     10
50     abdul   80      5
50     abdul   80      6

我想拆分此表(根据名称删除重复列,唯一列将以逗号分隔)

mark      name     total    point
70,80     bala     100        10
100       karthik  100,150     5
50        abdul    80       10,5,6

3 个答案:

答案 0 :(得分:3)

使用

In [858]: (df.astype(str).groupby('name', as_index=False, sort=False)
             .apply(lambda x: pd.Series({v: ','.join(x[v].unique()) for v in x})))
Out[858]:
    mark     name    total   point
0  70,80     bala      100      10
1    100  karthik  100,150       5
2     50    abdul       80  10,5,6

或者,

In [863]: (df.astype(str).groupby('name', as_index=False, sort=False)
             .apply(lambda x: x.apply(lambda x: ','.join(x.unique()))))
Out[863]:
    mark     name    total   point
0  70,80     bala      100      10
1    100  karthik  100,150       5
2     50    abdul       80  10,5,6

答案 1 :(得分:2)

借助数据透视表

df.pivot_table(index='name',aggfunc=lambda x : ','.join(x.unique().astype(str))).reset_index()

输出:

    name   mark   point    total
0    abdul     50  10,5,6       80
1     bala  70,80      10      100
2  karthik    100       5  100,150

答案 2 :(得分:2)

使用DataFrameGroupBy.agg

df = (df.astype(str)
       .groupby('name', as_index=False, sort=False)
       .agg(lambda x: ','.join(x.unique())))
print (df)
      name   mark    total   point
0     bala  70,80      100      10
1  karthik    100  100,150       5
2    abdul     50       80  10,5,6