我试图将数据帧的行除以另一个数据帧中的相同索引行。每个数据框中的列数相同。
目标是将列列表除以另一列列。 有没有办法在熊猫中做到这一点?
以下是示例数据:
import pandas as pd
import numpy as np
data1 = {"a":[10.,20.,30.,40.,50.],
"b":[900.,800.,700.,600.,500.],
"c":[2.,4.,6.,8.,10.]}
data2 = {"f":[1.,2.,3.,4.],
"g":[900.,800.,700.,600.],
"h":[10.,20.,30.,40.]}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
预期产出:
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2
4 NaN NaN NaN
截至目前,我正在使用我写的这个小函数:
def divDF(df1, df2):
nRow, nCol = df1.shape
result = pd.DataFrame(np.empty((nRow, nCol)), index=df1.index)
for col in range(nCol):
result.iloc[:,col] = df1.iloc[:,col] / df2.iloc[:,col]
return result
这是唯一的方法,还是有更快的方法呢?
答案 0 :(得分:3)
除以值以得到索引对齐
dfd = df1.div(df2.values)
dfd.columns = df1.columns + '/' + df2.columns
dfd
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2
或者
c = df1.columns + '/' + df2.columns
pd.DataFrame(df1.values / df2.values, df1.index, c)
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2
c = df1.columns + '/' + df2.columns
d1 = dict(zip(df1.columns, c))
d2 = dict(zip(df2.columns, c))
df1.rename(columns=d1) / df2.rename(columns=d2)
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2
4 NaN NaN NaN
答案 1 :(得分:3)
使用align
强制索引对齐:
df3 = np.divide(*df1.align(df2, axis=0))
df3.columns = df1.columns + '/' + df2.columns
结果输出:
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2
4 NaN NaN NaN
答案 2 :(得分:2)
Pandas执行内部数据对齐,因此如果您在两个数据文件中标记行索引和列相同,Pandas将按预期执行操作。
您需要将列重命名为通用名称,并将字典映射旧列名称改为新名称,如下所示:
rn_df1 = dict(list(zip(df1.columns.values,(df1.columns+'/'+df2.columns))))
rn_df2 = dict(list(zip(df2.columns.values,(df1.columns+'/'+df2.columns))))
df1.rename(columns=rn_df1).div(df2.rename(columns=rn_df2))
输出:
a/f b/g c/h
0 10.0 1.0 0.2
1 10.0 1.0 0.2
2 10.0 1.0 0.2
3 10.0 1.0 0.2