我有以下数据框:
df = pd.DataFrame([
[123, 'abc', '121'],
[124, 'abc', '121'],
[456, 'def', '121'],
[123, 'abc', '122'],
[123, 'abc', '122'],
[456, 'def', '145'],
[456, 'def', '145'],
[456, 'def', '146'],
], columns=['userid', 'name', 'dt'])
我根据日期对其进行了分组:
df2 = df.groupby('dt').apply(lambda df: df.reset_index(drop=True))
现在,我想调整上面的内容,使它们采用以下格式:
userid name_1, name_2, ..., name_k
为每个组,使得结束df看起来像这样:
userid name
123 abc
124 abc
456 def
123 abc, abc
答案 0 :(得分:2)
您可以将cumcount
与pivot_table
一起使用,其中参数索引使用列userid
和dt
,因此看起来不需要创建df2
:< / p>
df['cols'] = 'name_' + (df.groupby(['userid','dt']).cumcount() + 1).astype(str)
print (df.pivot_table(index=['userid', 'dt'],columns='cols', values='name', aggfunc=''.join))
cols name_1 name_2
userid dt
123 121 abc None
122 abc abc
124 121 abc None
456 121 def None
145 def def
146 def None
答案 1 :(得分:2)
结帐groupby
和apply
。他们各自的文档是here和here。您可以unstack
(docs)创建MultiIndex的额外级别。
df = df.set_index(['userid', 'dt'])['name']
df = df.groupby(level=[0,1]).apply(
lambda st: pd.Series(st.values, index=['name_%i'%i for i in range(st.shape[0])])
).unstack(level=-1)
print(df)
输出
name_0 name_1
userid dt
123 121 abc None
122 abc abc
124 121 abc None
456 121 def None
145 def def
146 def None