我喜欢这样的。我想分组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
请帮助解决这个问题。
谢谢
答案 0 :(得分:1)
需要DataFrameGroupBy.agg
join
和astype
转换数字列:
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]