我有这样的数据框:
我想将“地图名称”拆分为多个列,其中“值”作为列名,““地图百分比””作为列数据的值。
我尝试使用df.explode()并得到了以下提示:
我想要的是这样的东西,它将“地图名称”显示为“列名称”,并显示“地图百分比”作为其值:
答案 0 :(得分:1)
这里是concat
的一种方法:
# toy data
df = pd.DataFrame({'Map Name':[['Train', 'Vertigo', 'Nuke', 'Inferno'],
['Inferno', 'Dust2', 'Vertigo']],
'Map Percentage':[['10%','20%','30%','40%'], ['5%','6%','7%']]})
(pd.concat([df['Map Name'].explode().reset_index(),
df['Map Percentage'].explode()
.reset_index(drop=True)
.str.replace('%','').astype(float)], # remove % and convert to float
axis=1)
.pivot_table(index='index',
columns='Map Name',
values='Map Percentage',
aggfunc='first',
fill_value=0)
)
输出:
Map Name Dust2 Inferno Nuke Train Vertigo
index
0 0 40 30 10 20
1 6 5 0 0 7
答案 1 :(得分:0)
我建议手动执行此操作,并使用iterrows()遍历您的每一行,然后创建一个具有2个列的新数据框:map
和percentage
,然后进行groupby映射:
new_df = pd.DataFrame(["Map", "Percentage"])
for col in df.iterrows():
for i in range(len(col["Map Name"])):
new_df[col["Map Name"][i]] = col["Map Percentage"][i]]
# Group all rows matching the same map and get the average percentage for the group
new_df.groupby("Map").mean()
我不确定所有语法是否都可以设置数据帧的名称并追加新行,所以我让您检查一下:),但对于逻辑它应该起作用。
Ps:如果您有一个较小的数据框(我想您有,CounterStrike不会生成那么多的数据:D),这将正确地工作,如果没有,也许将lambda应用于每一行会更好地工作允许留在数据框世界中。