将两列转换为多列

时间:2019-12-09 19:13:33

标签: python pandas dataframe

我有这样的数据框:

enter image description here

我想将“地图名称”拆分为多个列,其中“值”作为列名,““地图百分比””作为列数据的值。

我尝试使用df.explode()并得到了以下提示:

enter image description here

我想要的是这样的东西,它将“地图名称”显示为“列名称”,并显示“地图百分比”作为其值:

enter image description here

2 个答案:

答案 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个列的新数据框:mappercentage,然后进行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应用于每一行会更好地工作允许留在数据框世界中。