Python 熊猫:使用重复条目重塑数据帧

Python 熊猫:使用重复条目重塑数据帧,python,pandas,dataframe,reshape,Python,Pandas,Dataframe,Reshape,我有一个名为DF deathtype height deaths 0 AMS 4900 1 1 AMS 5150 1 2 AMS 5300 1 3 Avalanche 5350 14 4 Avalanche 5600 4 5 Avalanche 5700 1 6 Avalanche 58

我有一个名为
DF

    deathtype    height    deaths
0   AMS           4900       1
1   AMS           5150       1
2   AMS           5300       1
3   Avalanche     5350       14
4   Avalanche     5600       4
5   Avalanche     5700       1
6   Avalanche     5800       17
7   Unexplained   8500       1
8   Unexplained   8560       1
我正试图将数据重塑为以下内容:

deaths         1                4          14       17
deathtype               
AMS           4900,5150,5300    0          0        0
Avalanche     5700              5600       5350     5800
Unexplained   8500, 8560        0          0        0
df.pivot_table(index='deathtype', columns='deaths', values='height', fill_value='0')

deaths           1              4      14     17
deathtype               
AMS           5116.666667       0      0      0
Avalanche     5700.000000       5600   5350   5800
Unexplained   8530.000000       0      0      0
我知道pivot_表无法实现这一点,因为aggfunc使用重复值的平均值,这意味着对于所有
死亡
值1,将记录平均值。pivot_表给了我以下信息:

deaths         1                4          14       17
deathtype               
AMS           4900,5150,5300    0          0        0
Avalanche     5700              5600       5350     5800
Unexplained   8500, 8560        0          0        0
df.pivot_table(index='deathtype', columns='deaths', values='height', fill_value='0')

deaths           1              4      14     17
deathtype               
AMS           5116.666667       0      0      0
Avalanche     5700.000000       5600   5350   5800
Unexplained   8530.000000       0      0      0

我正在寻找一些关于如何着手做这件事的建议。看起来pivot_表不是正确的方法。有人能提供一些提示吗。

使用
groupby
和aggregate by
join
,然后通过
取消堆栈来重塑:

d = lambda x: ', '.join(x.astype(str))
df = df.groupby(['deathtype', 'deaths'])['height'].agg(d).unstack(fill_value='0')
print (df)
deaths                     1     4     14    17
deathtype                                      
AMS          4900, 5150, 5300     0     0     0
Avalanche                5700  5600  5350  5800
Unexplained        8500, 8560     0     0     0
详细信息

print (df.groupby(['deathtype', 'deaths'])['height'].agg(lambda x: ', '.join(x.astype(str))))
deathtype    deaths
AMS          1         4900, 5150, 5300
Avalanche    1                     5700
             4                     5600
             14                    5350
             17                    5800
Unexplained  1               8500, 8560
Name: height, dtype: object
另一个解决方案包括:


耶斯雷尔-非常感谢您展示了这两种方法。这正是我所需要的。