Groupby,转置和追加 Pandas?
Groupby, transpose and append in Pandas?
我有一个如下所示的数据框:
每个用户有10条记录。现在,我想创建一个如下所示的数据框:
userid name1 name2 ... name10
这意味着我需要反转列 name
的每 10 条记录并附加到新的数据框。
那么,它是怎么做到的呢?有什么办法可以在 Pandas 中完成吗?
groupby('userid')
然后在每个组内 reset_index
以一致地跨组枚举。然后 unstack
获取列。
df.groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()
示范[=28=]
df = pd.DataFrame([
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[456, 'def'],
[456, 'def'],
], columns=['userid', 'name'])
df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()
如果您不想将 userid
作为索引,请在末尾添加 reset_index
。
df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()
感兴趣
查看此示例数据框:
df
userid name values
0 123 A 1
1 123 B 2
2 123 C 3
3 456 A 4
4 456 B 5
5 456 C 6
使用df.pivot
df.pivot(index='userid', columns='name', values='values')
name A B C
userid
123 1 2 3
456 4 5 6
我有一个如下所示的数据框:
每个用户有10条记录。现在,我想创建一个如下所示的数据框:
userid name1 name2 ... name10
这意味着我需要反转列 name
的每 10 条记录并附加到新的数据框。
那么,它是怎么做到的呢?有什么办法可以在 Pandas 中完成吗?
groupby('userid')
然后在每个组内 reset_index
以一致地跨组枚举。然后 unstack
获取列。
df.groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()
示范[=28=]
df = pd.DataFrame([
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[456, 'def'],
[456, 'def'],
], columns=['userid', 'name'])
df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()
df = pd.DataFrame([
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[123, 'abc'],
[123, 'abc'],
[456, 'def'],
[456, 'def'],
[456, 'def'],
], columns=['userid', 'name'])
df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack()
如果您不想将 userid
作为索引,请在末尾添加 reset_index
。
df.sort_values('userid').groupby('userid')['name'].apply(lambda df: df.reset_index(drop=True)).unstack().reset_index()
查看此示例数据框:
df
userid name values
0 123 A 1
1 123 B 2
2 123 C 3
3 456 A 4
4 456 B 5
5 456 C 6
使用df.pivot
df.pivot(index='userid', columns='name', values='values')
name A B C
userid
123 1 2 3
456 4 5 6