2016-02-13 46 views
1

我需要得到多个列的百分比变化。熊猫百分比变化与缺失数据

import pandas as pd 
t="""Year\tChild\tBehaviour 
1987\tBoy\tGood 
1987\tGirl\tGood 
1987\tBoy\tBad 
1987\tGirl\tBad 
2020\tBoy\tBad 
2020\tBoy\tBad 
2020\tGirl\tBad 
2020\tGirl\tBad""" 
from io import StringIO 
df=pd.read_table(StringIO(t)) 
pv=pd.crosstab(df["Child"], [df["Year"], df["Behaviour"]]) 
print(pv) 
print(pv[2020]/pv[1987]-1) 

在未来残酷的世界也真不是个多好的孩子,这是一个问题,因为我得到的NaN代替-1(-100%):

Year  1987  2020 
Behaviour Bad Good Bad 
Child     
Boy   1 1 2 
Girl   1 1 2 

Behaviour Bad Good 
Child    
Boy   1 NaN 
Girl   1 NaN 

这怎么可能一般情况下解决?我是否需要预先填写由0填充的缺失列?或者有另一种方法来获得百分比变化

+0

最简单的可能是确保你有一个列“好”以零为一年。 – joris

回答

1

您可能想要类似这样的东西,使用fillna方法?

>>> (pv[2020]/pv[1987]).fillna(0) - 1 
Behaviour Bad Good 
Child    
Boy   1 -1 
Girl   1 -1 

另一个方法是先用dropna=True参数从crosstab功能:

>>> pv = pd.crosstab(df["Child"], [df["Year"], df["Behaviour"]], dropna=False) 
>>> pv 
     1987  2020  
     Bad Good Bad Good 
Child      
Boy  1 1 2 0 
Girl  1 1 2 0 

>>> pv[2020]/pv[1987] - 1 
     Bad Good 
Child   
Boy  1 -1 
Girl  1 -1 
+0

谢谢,我无法弄清楚'dropna'参数如何影响结果。 – Winand

+0

'dropna = False'由于某种原因而删除列级别名称。看起来像一个错误。 – Winand

相关问题