熊猫除法返回具有所有NaN的数据框

时间:2020-04-12 13:59:47

标签: python pandas

我有2个Pandas数据帧,totalsmedal_counts。头信息如下。

print(medal_counts.head())

NOC      AFG  AHO  ALG   ANZ  ARG  ARM  AUS   AUT  AZE  BAH  ...  URS  URU  \
Edition                                                      ...             
1896     NaN  NaN  NaN   NaN  NaN  NaN  2.0   5.0  NaN  NaN  ...  NaN  NaN   
1900     NaN  NaN  NaN   NaN  NaN  NaN  5.0   6.0  NaN  NaN  ...  NaN  NaN   
1904     NaN  NaN  NaN   NaN  NaN  NaN  NaN   1.0  NaN  NaN  ...  NaN  NaN   
1908     NaN  NaN  NaN  19.0  NaN  NaN  NaN   1.0  NaN  NaN  ...  NaN  NaN   
1912     NaN  NaN  NaN  10.0  NaN  NaN  NaN  14.0  NaN  NaN  ...  NaN  NaN   

NOC        USA  UZB  VEN  VIE  YUG  ZAM  ZIM   ZZX  
Edition                                             
1896      20.0  NaN  NaN  NaN  NaN  NaN  NaN   6.0  
1900      55.0  NaN  NaN  NaN  NaN  NaN  NaN  34.0  
1904     394.0  NaN  NaN  NaN  NaN  NaN  NaN   8.0  
1908      63.0  NaN  NaN  NaN  NaN  NaN  NaN   NaN  
1912     101.0  NaN  NaN  NaN  NaN  NaN  NaN   NaN  
[5 rows x 138 columns]

print(totals.head())

Edition
1896    151
1900    512
1904    470
1908    804
1912    885
Name: Grand Total, dtype: int64

当我尝试使用除法使用'totals'按行对'medal_counts'进行除法时,为什么我得到所有NaN,尽管medal_counts中有一些明确的值,例如1896中的{ {1}}。

AUS, AUT, USA & ZZX

明确的说明。

2 个答案:

答案 0 :(得分:1)

使用熊猫divide时:

df.divide(other)

other的类型可以是:scalar, sequence, Series, or DataFrame

在您的情况下,如果您指定一个序列,它将起作用:

fractions = medal_counts.divide(totals['Edition'], axis='rows')

那么,我们什么时候应该使用dataframe

如果另一个数据框的形状与df相同。 例如:

df = pd.DataFrame({'angles': [0, 3, 4],
                   'degrees': [360, 180, 360]},
                  index=['circle', 'triangle', 'rectangle'])
df
           angles  degrees
circle          0      360
triangle        3      180
rectangle       4      360

您可以这样做:

>>> df.divide(df+1, axis='index')

           angles   degrees
circle       0.00  0.997230
triangle     0.75  0.994475
rectangle    0.80  0.997230

为什么转换为numpy数组不安全?

如果您的行被打乱,您将得到错误的答案:

df
           angles  degrees
circle          0      360
triangle        3      180
rectangle       4      360

随机播放angles列并创建一个新的df:

df2 = df[['angles']].sample(frac=1)
df2
           angles
triangle        3
circle          0
rectangle       4

所需的输出:

>>> df.divide(df2['angles'], axis='rows')
           angles  degrees
circle        NaN      inf
rectangle     1.0     90.0
triangle      1.0     60.0

和使用numpy数组的输出:

>>> df.divide(df2['angles'].values, axis='rows')
           angles  degrees
circle        0.0    120.0
triangle      inf      inf
rectangle     1.0     90.0

答案 1 :(得分:0)

下面的转换有效。

totals = totals.values
fractions = medal_counts.divide(totals, axis='rows')