基于列值匹配

时间:2018-05-15 13:35:19

标签: python pandas

我喜欢这样的。我想分组id和amp;时间值匹配。我试过groupby但是无法做到。

 >>> df
       number title   id       time
    0      10    aa  100  02.05.2018  04
    1      11    bb  100  02.05.2018  04

期望的输出

>>> df
       number   title   id     time
0      10 11    aa bb  100  02.05.2018  04

请帮助解决这个问题。

谢谢

2 个答案:

答案 0 :(得分:1)

需要DataFrameGroupBy.agg joinastype转换数字列:

df = df.groupby(['id','time'], as_index=False).agg(lambda x: ' '.join(x.astype(str)))
print (df)

    id            time  number  title
0  100  02.05.2018  04   10 11  aa bb

或者转换所有列,而不是先分组到str

df[df.columns.difference(['id','time'])]=df[df.columns.difference(['id','time'])].astype(str)
df = df.groupby(['id','time'], as_index=False).agg(' '.join)
print (df)

    id            time  number  title
0  100  02.05.2018  04   10 11  aa bb

如果不转换,则会以静默方式删除所有数字列:

df = df.groupby(['id','time'], as_index=False).agg(' '.join)
print (df)

    id            time  title
0  100  02.05.2018  04  aa bb

如果需要只过滤一些列:

cols = ['number']
df = df.groupby(['id','time'], as_index=False)[cols].agg(lambda x: ' '.join(x.astype(str)))
print (df)

    id            time number
0  100  02.05.2018  04  10 11

答案 1 :(得分:1)

如果您正在寻找名单

df.set_index(['id', 'time']).groupby(level=[0, 1]).apply(
    lambda d: pd.Series(d.to_dict('l'))
).reset_index()

    id           time    number     title
0  100  02.05.2018 04  [10, 11]  [aa, bb]