Python:将DataFrame的每行除以另一个DataFrame向量

36 投票
5 回答
89844 浏览
提问于 2025-04-17 23:51

我有一个数据表(叫做df1),它有2000行 x 500列(不算索引),我想把每一行都除以另一个数据表(叫做df2),df2的大小是1行 x 500列。这两个数据表的列名是一样的。我试过:

df.divide(df2)df.divide(df2, axis='index'),还有其他很多方法,但每次得到的结果都是一个满是nan的表格。请问我在df.divide这个函数里缺少了什么参数呢?

5 个回答

-3

要把一行(无论是单列还是多列)分开,我们需要做以下几步:

df.loc['index_value'] = df.loc['index_value'].div(10000)
2

如果你想把某一列的每一行都用一个特定的值来除,你可以试试下面的代码:

df['column_name'] = df['column_name'].div(10000)

对我来说,这段代码是把'column_name'这一列的每一行都除以10,000。

6

这里有个小补充,以防你不太明白:你看到到处都是NaN的原因是,Andy的第一个例子(df.div(df2))在第一行能正常工作,是因为div这个函数会尝试匹配索引(和列)。在Andy的例子中,索引0在两个数据框中都能找到,所以可以进行除法运算;而索引1在其中一个数据框中找不到,所以就会出现一行NaN。如果你运行下面的代码,你会发现这个行为更加明显(只有't'这一行进行了除法运算):

df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't'])
df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t'])
df_a.div(df_b)

所以在你的情况下,df2中唯一一行的索引显然在df1中不存在。 "幸运的是",两个数据框的列名是一样的,所以当你提取第一行时,你得到的一个序列,其索引是由df2的列名组成的。这就是最终让除法运算能够正常进行的原因。

下面是一个索引和列都匹配的例子:

df_a = pd.DataFrame(np.random.rand(3,5), index= ['x', 'y', 't'], columns = range(5))
df_b = pd.DataFrame(np.random.rand(2,5), index= ['z','t'], columns = [1,2,3,4,5])
df_a.div(df_b)
15

你可以用 series 来进行除法运算,也就是用 df2 的第一行数据。

In [11]: df = pd.DataFrame([[1., 2.], [3., 4.]], columns=['A', 'B'])

In [12]: df2 = pd.DataFrame([[5., 10.]], columns=['A', 'B'])

In [13]: df.div(df2)
Out[13]: 
     A    B
0  0.2  0.2
1  NaN  NaN

In [14]: df.div(df2.iloc[0])
Out[14]: 
     A    B
0  0.2  0.2
1  0.6  0.4
42

df.divide(df2, axis='index') 这个操作中,你需要提供 df2 的某一行(比如 df2.iloc[0])。

import pandas as pd

data1 = {"a":[1.,3.,5.,2.],
         "b":[4.,8.,3.,7.],
         "c":[5.,45.,67.,34]}
data2 = {"a":[4.],
         "b":[2.],
         "c":[11.]}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2) 

df1.div(df2.iloc[0], axis='columns')

或者你也可以使用 df1/df2.values[0,:] 这种方式。

撰写回答