根据索引将数据帧除以另一个数据帧

时间:2017-06-09 20:20:34

标签: python pandas

我试图将数据帧的行除以另一个数据帧中的相同索引行。每个数据框中的列数相同。

目标是将列列表除以另一列列。 有没有办法在熊猫中做到这一点?

以下是示例数据:

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

这是唯一的方法,还是有更快的方法呢?

3 个答案:

答案 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
相关问题