首页 > 解决方案 > 如何从交替的布尔行创建一个新的 Pandas DataFrame,以便新的 DataFrame 可以绘制?

问题描述

我希望有人可以帮助我找出安排我的 DataFrame 做散点图的最佳方法。散点图应在 x 轴上显示年份,在 y 轴上显示外国玩家百分比。DataFrame 有大约 400 行,为方便起见,我将显示一个值较少的头部。

我从一个更大的 DataFrame 开始使用这个 DataFrame:

df1 = df.head(5).loc[:, ['Year', 'Nationality', 'Foreign Player']]

    Year    Nationality Foreign Player
0   2016    United States   False
1   2016    United States   False
2   2016    United States   False
3   2016    United States   False
4   2016    United States   False

我按年做了一个 groupby,外国玩家把它做成了一个多索引 DataFrame:

df2 = df.groupby(['Year','Foreign Player']).count()[['Player']].head(6)

                          Player
Year    Foreign Player  
2000    False              26
        True               2
2001    False              21
        True               5
2002    False              20
        True               5

我重置索引以制作单个索引 DataFrame:

df3 = df2.reset_index(level = [0,1]).head(6)

    Year    Foreign Player  Player
0   2000    False             26
1   2000    True              2
2   2001    False             21
3   2001    True              5
4   2002    False             20

如您所见,True 和 False 与不同列中的相应值交替出现。我想做类似的事情:

df3['Percent Foreign'] = df3[['Foreign Player']= False] / (df3[['Foreign Player']= False ] + df3[['Foreign Player']= True)

显然那是行不通的。我的目标是一个新的 DataFrame:

    Year    Percent Foreign 
0   2000    15
1   2001    12          
2   2002    5           
3   2003    22          
4   2004    17  

    

比如我可以使用 Matplotlib 绘制 x = Year 和 x = Percent Foreign。无论如何,如果有一种更简单的方法可以在更早的步骤中绘制它,那就更好了。

再次感谢!

标签: pythonpandasdataframematplotlib

解决方案


对于选择False值用于反转掩码~,将 的值转换Year为索引并除以聚合sum

print (df3)
  Year  Foreign Player  Player
0  2000           False      26
1  2000            True       2
2  2001           False      21
3  2001            True       5
4  2002           False      20
4  2002            True      10

df4 = (df3[~df3['Foreign Player']].set_index('Year')['Player'] / 
       df3.groupby('Year')['Player'].sum()).mul(100).reset_index(name='Percent Foreign')

print (df4)
   Year  Percent Foreign
0  2000        92.857143
1  2001        80.769231
2  2002        66.666667

另一个想法是df2改变Series.unstack

df22 = df.groupby(['Year','Foreign Player'])['Player'].count().unstack()
print (df22)
Foreign Player  False  True 
Year                        
2000               26      2
2001               21      5
2002               20     10

然后将False列除以两列之和:

df4 = (df22[False] / df22.sum(axis=1)).mul(100).reset_index(name='Percent Foreign')

print (df4)
   Year  Percent Foreign
0  2000        92.857143
1  2001        80.769231
2  2002        66.666667

对于Trues 的百分比:

df5 = (df22[True] / df22.sum(axis=1)).reset_index(name='Percent Foreign') 

推荐阅读