交叉表填充另一列的数据
crosstab to fill with data of another column
我不是来用另一列的数据填充交叉表的:也许这不是解决方案...
initial dataframe final waited
id id_m X
0 10 10 a
1 10 11 b id_m 10 11 12
2 10 12 c id
3 11 10 d -> 10 a b c
4 11 11 e 11 d e f
5 11 12 f 12 g h i
6 12 10 g
7 12 11 h
8 12 12 i
我的代码可以帮助你:
import pandas as pd
df= pd.DataFrame({'id': [10, 11,12]})
df_m = pd.merge(df.assign(key=0), df.assign(key=0), suffixes=('', '_m'), on='key').drop('key', axis=1)
# just a sample to populate the column
df_m['X'] =['a','b' ,'c','d', 'e','f','g' ,'h', 'i']
如果你原来的df
是这个
id id_m X
0 10 10 a
1 10 11 b
2 10 12 c
3 11 10 d
4 11 11 e
5 11 12 f
6 12 10 g
7 12 11 h
8 12 12 i
而你想要的就是这个
id_m 10 11 12
id
10 a b c
11 d e f
12 g h i
您可以 groupby
id
和 id_m
列,取 X
列的 max
,然后 unstack
id_m
这样的专栏。
df.groupby([
'id',
'id_m'
]).X.max().unstack()
如果你真的想用pivot_table
你也可以这样做
df.pivot_table(index='id', columns='id_m', values='X', aggfunc='max')
相同的结果。
最后,您可以只使用 pivot
,因为您的行在索引和列方面是唯一的。
df.pivot(index='id', columns='id_m')
参考资料
你的有点棘手,因为你有文本 values
,你必须明确告诉 pandas aggfunc
,你可以使用 lambda
函数喜欢以下内容:
df_final = pd.pivot_table(df_m, index='id', columns='id_m', values='X', aggfunc=lambda x: ' '.join(x) )
id_m 10 11 12
id
10 a b c
11 d e f
12 g h i
我不是来用另一列的数据填充交叉表的:也许这不是解决方案...
initial dataframe final waited
id id_m X
0 10 10 a
1 10 11 b id_m 10 11 12
2 10 12 c id
3 11 10 d -> 10 a b c
4 11 11 e 11 d e f
5 11 12 f 12 g h i
6 12 10 g
7 12 11 h
8 12 12 i
我的代码可以帮助你:
import pandas as pd
df= pd.DataFrame({'id': [10, 11,12]})
df_m = pd.merge(df.assign(key=0), df.assign(key=0), suffixes=('', '_m'), on='key').drop('key', axis=1)
# just a sample to populate the column
df_m['X'] =['a','b' ,'c','d', 'e','f','g' ,'h', 'i']
如果你原来的df
是这个
id id_m X
0 10 10 a
1 10 11 b
2 10 12 c
3 11 10 d
4 11 11 e
5 11 12 f
6 12 10 g
7 12 11 h
8 12 12 i
而你想要的就是这个
id_m 10 11 12
id
10 a b c
11 d e f
12 g h i
您可以 groupby
id
和 id_m
列,取 X
列的 max
,然后 unstack
id_m
这样的专栏。
df.groupby([
'id',
'id_m'
]).X.max().unstack()
如果你真的想用pivot_table
你也可以这样做
df.pivot_table(index='id', columns='id_m', values='X', aggfunc='max')
相同的结果。
最后,您可以只使用 pivot
,因为您的行在索引和列方面是唯一的。
df.pivot(index='id', columns='id_m')
参考资料
你的有点棘手,因为你有文本 values
,你必须明确告诉 pandas aggfunc
,你可以使用 lambda
函数喜欢以下内容:
df_final = pd.pivot_table(df_m, index='id', columns='id_m', values='X', aggfunc=lambda x: ' '.join(x) )
id_m 10 11 12
id
10 a b c
11 d e f
12 g h i