将数据帧与其他数据帧的值相乘

时间:2017-08-21 16:32:02

标签: python pandas dataframe

我有两个数据帧

df1 = pd.DataFrame([[1,2],[3,4],[5,6],[7,8]], index = ['a','b','c', 'a'], columns = ['d','e'])
   d  e
a  1  2
b  3  4
c  5  6
a  7  8


df2 = pd.DataFrame([['a', 10],['b',20],['c',30],['f',40]])


   0   1
0  a  10
1  b  20
2  c  30
3  f  40

我希望我的最终数据帧将df1的行数乘以与df2中的值相对应的因子(例如,对于b为20)

所以我的输出应该是

     d    e
a   10   20
b   60   80
c  150  180
a   70   80

请提供一个解决方案,假设df1的长度为数百行。我只能想到循环遍历df1.index。

4 个答案:

答案 0 :(得分:2)

使用set_indexreindexdf2df1对齐,然后mul

In [1150]: df1.mul(df2.set_index(0).reindex(df1.index)[1], axis=0)
Out[1150]:
     d    e
a   10   20
b   60   80
c  150  180
a   70   80

答案 1 :(得分:1)

创建df.apply并致电In [1128]: mapping = dict(df2.values) In [1129]: df1.apply(lambda x: x * mapping[x.name], 1) Out[1129]: d e a 10 20 b 60 80 c 150 180 a 70 80

    commandout=()
    while IFS= read -r line # Read a line
    do
        commandout+=("$line") # Append line to the array
    done < <(tmsh list ltm virtual $vip | grep destination)
    for output in "$commandout";
    do
        if [[ $output == *"destination"* ]];then
            #split off ip and port
            ipport=$(echo $output | awk 'BEGIN{}{print $2}')
            echo $ipport | awk 'BEGIN{FS=":"}{print $1}'
            echo $ipport
        fi
    done
    declare -p commandout

答案 2 :(得分:0)

IIUC:

In [55]: df1 * pd.DataFrame(np.tile(df2[[1]],2), columns=df1.columns, index=df2[0])
Out[55]:
     d    e
a   10   20
a   70   80
b   60   80
c  150  180

Helper DF:

In [57]: pd.DataFrame(np.tile(df2[[1]],2), columns=df1.columns, index=df2[0])
Out[57]:
    d   e
0
a  10  10
b  20  20
c  30  30

答案 3 :(得分:0)

这是直截了当的。您只需确保它们具有公共轴,然后您可以将它们组合在一起:

将查阅列放入索引

df2.set_index(0, inplace=True)

    1
0   
a   10
b   20
c   30

现在您可以非常轻松地将该列放入df1:

df1['multiplying_factor'] = df2[1]

现在您只想将两列相乘:

df1['final_value'] = df1.e*df1.multiplying_factor

现在df1看起来像:

    d   e   multiplying_factor  final_value
a   1   2   10                  20
b   3   4   20                  80
c   5   6   30                  180
a   7   8   10                  80