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

Plu*_*ug4 23 python pandas

我有一个DataFrame(df1),其维度2000 rows x 500 columns(不包括索引)我希望将每行与另一个DataFrame(df2)除以维度1 rows X 500 columns.两者都有相同的列标题.我试过了:

df.divide(df2)以及 df.divide(df2, axis='index')多个其他解决方案,我总是nan在每个单元格中获得带有值的df .我在函数中缺少什么参数df.divide

小智 25

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')
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 df1/df2.values[0,:]


And*_*den 12

你可以除以系列,即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
Run Code Online (Sandbox Code Playgroud)


etn*_*tna 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)
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,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)
Run Code Online (Sandbox Code Playgroud)