交叉表填充另一列的数据

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 idid_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