繁体   English   中英

仅在 Pandas 数据框中旋转两列并添加其中一列

[英]pivot only two columns in pandas dataframe and add one of them

我有一个数据框,如:

             m_id     p_id          coins     price  game_level
0            5012     26456         5120.0  15990.0   level 5
1            5012     26457        15360.0  12000.0   level 4
2            5012     26470        15360.0   8990.0   level 2
3            5012     26471        30720.0   9990.0   level 1
4            5013     26472        15360.0   4990.0   level 1
5            5013     26473        30720.0   5990.0   level 4
6            5014     26456         5120.0  15990.0   level 5
7            5014     26457        15360.0  12000.0   level 4
8            5015     26470        15360.0   8990.0   level 2
9            5015     26471        30720.0   9990.0   level 1

我想要这个 df。 (枢轴和计算列硬币和级别,以及此 m_id.p_id 的价格字段的添加,您可以删除它):

   m_id    coins 1   coins 2   coins 3   coins 4  price   game_level 1  game_level 2   game_level 3   game_level 4
0  5012     5120.0   15360.0   15360.0   30720.0  46970        level 5       level 4        level 2        level 1
1  5013    15360.0   30720.0         0         0  10980        level 1       level 4              0              0
2  5014     5120.0   15360.0         0         0  27990        level 5       level 4              0              0
3  5015    15360.0   30720.0         0         0  16980        level 2       level 1              0              0

任何的想法?

您可以通过创建一个运行编号列然后使用groupbyunstack来解决这个问题。

# Create running number column for each m_id
df['running_num'] = df.groupby(['m_id']).cumcount()+1

result = (df.groupby(["m_id","running_num"])[['coins', 'game_level']]
            .agg(lambda x: x)
            .unstack(fill_value=0)
            .reset_index())

# Rename columns
result.columns = [f"{x} {y}" if y != "" else x for x,y in result.columns]

result

   m_id  coins 1  coins 2  coins 3  coins 4 game_level 1 game_level 2  \
0  5012   5120.0  15360.0  15360.0  30720.0      level 5      level 4   
1  5013  15360.0  30720.0      0.0      0.0      level 1      level 4   
2  5014   5120.0  15360.0      0.0      0.0      level 5      level 4   
3  5015  15360.0  30720.0      0.0      0.0      level 2      level 1   

  game_level 3 game_level 4  
0      level 2      level 1  
1            0            0  
2            0            0  
3            0            0  

您可以添加价格列

result = result.merge(df.groupby(['m_id'], as_index=False).price.sum(), on='m_id')

result

   m_id  coins 1  coins 2  coins 3  coins 4 game_level 1 game_level 2  \
0  5012   5120.0  15360.0  15360.0  30720.0      level 5      level 4   
1  5013  15360.0  30720.0      0.0      0.0      level 1      level 4   
2  5014   5120.0  15360.0      0.0      0.0      level 5      level 4   
3  5015  15360.0  30720.0      0.0      0.0      level 2      level 1   

  game_level 3 game_level 4    price  
0      level 2      level 1  46970.0  
1            0            0  10980.0  
2            0            0  27990.0  
3            0            0  18980.0  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM