如何在Python pandas中对相同浮点列逐行划分?
我有一个叫做pandas的数据表,里面有两列是浮点数,分别叫X和Y,还有一列是字符串,叫A。
这两列浮点数的内容都是正数。
我想提取出A列中值为'a'的那一行和A列中值为'b'的另一行。
然后我想把这两行的浮点数列进行相除,也就是做a/b,代码如下。
但是问题是,计算的结果是NaN(不是一个数字)。这是为什么呢?
我试过使用axis=0和axis=1,但结果还是一样。
我使用的python pandas版本是1.0.5。
这是我的代码:
import pandas as pd
ddd = {
'A': ['a', 'b'],
'X': [100.0, 20.0],
'Y': [6.0, 2.0]
}
df = pd.DataFrame(ddd)
df1 = df[df['A'] =='a']
df2 = df[df['A'] == 'b']
print(df1)
print(df2)`
res = df1.iloc[:, 1:].div(df2.iloc[:, 1:], axis=0)
print(res)
res = df1.iloc[:, 1:].div(df2.iloc[:, 1:], axis=1)
print(res)
结果
X Y
0 NaN NaN
0 NaN NaN
2 个回答
1
不要使用布尔索引。可以把"A"设置为索引:
ddd = {
'A': ['a', 'b', 'c', 'd'],
'X': [100.0, 20.0, 5.0, 2.0],
'Y': [6.0, 2.0, 1.0, 1.0]
}
df = pd.DataFrame(ddd).set_index('A')
lst = [('a', 'b'), ('c', 'd')]
out = [df.loc[x]/df.loc[y] for x, y in lst]
输出结果:
[X 5.0
Y 3.0
dtype: float64,
X 2.5
Y 1.0
dtype: float64]
或者,可以一次性索引所有组合:
df = pd.DataFrame(ddd).set_index('A')
lst = [('a', 'b'), ('c', 'd')]
x, y = map(list, zip(*lst))
out = (df.loc[x].div(df.loc[y].values)
.set_axis(lst)
)
输出结果:
X Y
(a, b) 5.0 3.0
(c, d) 2.5 1.0
df
:
X Y
A
a 100.0 6.0
b 20.0 2.0
c 5.0 1.0
d 2.0 1.0
注意:我假设"A"中的字母是唯一的。
如果有缺失值,可以使用reindex
:
ddd = {
'A': ['a', 'b', 'c'],
'X': [100.0, 20.0, 5.0],
'Y': [6.0, 2.0, 1.0]
}
df = pd.DataFrame(ddd).set_index('A')
lst = [('a', 'b'), ('c', 'd')]
x, y = map(list, zip(*lst))
out = (df.reindex(x).div(df.reindex(y).values)
.set_axis(lst)
)
X Y
(a, b) 5.0 3.0
(c, d) NaN NaN
0
.div
这个操作只有在两个行的索引相同的情况下才能使用,所以你需要这样做:
df2 = df[df['A'] == 'b'].reset_index(drop=True)
这样做之后,得到的结果是:
X Y
0 5.0 3.0