我有2个Pandas数据帧,totals
和medal_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
明确的说明。
答案 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')