我有一个DataFrame(df1),其维度为2000 rows x 500 columns
(不包括索引),我希望将每行划分为另一个维度为1 rows X 500 columns
的DataFrame(df2)。两者都有相同的列标题。我试过了:
df.divide(df2)
和
df.divide(df2, axis='index')
以及其他多个解决方案,我总是会在每个单元格中获得一个nan
值的df。我在函数df.divide
中缺少什么参数?
答案 0 :(得分:23)
在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,:]
答案 1 :(得分: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
答案 2 :(得分:5)
以下是小的澄清:为什么你到处都有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)
答案 3 :(得分:2)
如果要将列的每一行划分为特定值,可以尝试:
df['column_name'] = df['column_name'].div(10000)
对我来说,这段代码分为' column_name'的每一行。 10,000。
答案 4 :(得分:-2)
要划分一行(有一列或多列),我们需要执行以下操作:
a d g
b e
c f