我正在致力于奥运数据集,并希望创建另一个数据,其中有运动员总数和奖牌总数按类型为每个国家。使用下面的pivot_table给出一个错误"ValueError:石斑鱼“表示'ID‘而不是一维”pd.pivot_table(olymp, index='NOC', columns=['ID','Medal'], values=['ID','Medal'], aggfunc={'ID':pd.Series.nunique,'Medal':'count'}).sort_values(by='Medal')“
结果应为每个国家一排,totalAthletes、金、银、铜牌为栏。不知道如何使用pivot_table来实现它。我可以使用交叉表的合并来完成这个任务,但是我只想使用一个pivottable语句。这里是原始df的样子。

发布于 2022-02-15 20:40:03
更新
我想得到奖牌的细分,例如金牌,银牌,铜牌。另外,我需要运动员id的唯一计数,所以我使用nunique,因为一个运动员可以参加多个项目。奖牌也是一样,忽略了NA的价值
IIUC:
out = df.pivot_table('ID', 'NOC', 'Medal', aggfunc='count', fill_value=0)
out['ID'] = df[df['Medal'].notna()].groupby('NOC')['ID'].nunique()输出:
>>> out
Medal Bronze Gold Silver ID
NOC
AFG 2 0 0 1
AHO 0 0 1 1
ALG 8 5 4 14
ANZ 5 20 4 25
ARG 91 91 92 231
.. ... ... ... ...
VIE 0 1 3 3
WIF 5 0 0 4
YUG 93 130 167 317
ZAM 1 0 1 2
ZIM 1 17 4 16
[149 rows x 4 columns]旧答案
对于columns和values,不能有相同的列
out = olymp.pivot_table(index='NOC', values=['ID','Medal'],
aggfunc={'ID':pd.Series.nunique, 'Medal':'count'}) \
.sort_values('Medal', ascending=False)
print(out)
# Output
ID Medal
NOC
USA 9653 5637
URS 2948 2503
GER 4872 2165
GBR 6281 2068
FRA 6170 1777
.. ... ...
GAM 33 0
GBS 15 0
GEQ 26 0
PNG 61 0
LBA 68 0
[230 rows x 2 columns]获得上述结果的另一种方法是:
out = olym.groupby('NOC').agg({'ID': pd.Series.nunique, 'Medal': 'count'}) \
.sort_values('Medal', ascending=False)
print(out)
# Output
ID Medal
NOC
USA 9653 5637
URS 2948 2503
GER 4872 2165
GBR 6281 2068
FRA 6170 1777
.. ... ...
GAM 33 0
GBS 15 0
GEQ 26 0
PNG 61 0
LBA 68 0
[230 rows x 2 columns]https://stackoverflow.com/questions/71132809
复制相似问题