如何在Python pandas中对相同浮点列逐行划分?

1 投票
2 回答
46 浏览
提问于 2025-04-14 15:30

我有一个叫做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

撰写回答