【问题标题】:How to multiply dataframe by row如何逐行乘以数据帧
【发布时间】:2022-01-01 11:02:54
【问题描述】:

您好,我正在尝试将一个数据帧与另一个数据帧中的一行相乘。

df1

Date ABC DEF XYZ
2020-01-31 3 4 2
2020-02-31 1 3 5
2020-03-31 4 2 6
2020-04-31 2 2 7

df2

Year ABC DEF XYZ
2020 .5 .4 .3

有没有办法在 DF1 的所有值上使用多个 DF2 以获得如下所示的 DF3。

df3

Date ABC DEF XYZ
2020-01-31 1.5 1.6 .6
2020-02-31 .5 1.2 1.5
2020-03-31 2 .8 1.8
2020-04-31 1 .8 2.1

我试过了

df3.loc[:,['ABC','DEF','XYZ']] = df1.mul(df2, level=1,axis='columns')

但我最终会发现 df3 充满了 NaN。

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:
cols = ['ABC', 'DEF', 'XYZ']
df3 = df1.copy()
df3[cols] = df3[cols].mul(df2[cols].values)

输出:

>>> df3
          Date  ABC  DEF  XYZ
0  2020-01-31   1.5  1.6  0.6
1  2020-02-31   0.5  1.2  1.5
2  2020-03-31   2.0  0.8  1.8
3  2020-04-31   1.0  0.8  2.1

这里的技巧不是乘以df2[cols],而是乘以df2[cols].values

【讨论】:

    【解决方案2】:
    df1.update(pd.DataFrame(df1.set_index('Date').values*df2.set_index('Year').values,columns=df1.iloc[:,-3:].columns))
    

    输出

            Date  ABC  DEF  XYZ
    0  2020-01-31  1.5  1.6  0.6
    1  2020-02-31  0.5  1.2  1.5
    2  2020-03-31  2.0  0.8  1.8
    3  2020-04-31  1.0  0.8  2.1
    

    它是如何工作的

    df1.set_index('Date').values 给你一个数组,比如数组 a

    df2.set_index('Year').values 给你数组 b

    pd.DataFrame(a*b, columns=,columns=df1.iloc[:,-3:].columns) 给你一个新的df

    df1.update(new df), 更新原始df

    【讨论】:

      【解决方案3】:

      在将列 abc、def、xyz 乘以 df2 之前,您必须复制 df1。用相乘的值更新这些列的值

      df1="""
      Date    ABC DEF XYZ
      2020-01-31  3   4   2
      2020-02-31  1   3   5
      2020-03-31  4   2   6
      2020-04-31  2   2   7
      """
      df2="""
      Year    ABC DEF XYZ
      2020    .5  .4  .3
      """
      
      def create_df(df):
          df=df.strip().split('\n')
          df=list(map(lambda x: x.strip().split('\t'),df))
          df=pd.DataFrame(df[1:],columns=df[0])
          return df
      
      df1=create_df(df1)
      df1['ABC']=df1['ABC'].astype(float)
      df1['DEF']=df1['DEF'].astype(float)
      df1['XYZ']=df1['XYZ'].astype(float)
      df2=create_df(df2)
      df2['ABC']=df2['ABC'].astype(float)
      df2['DEF']=df2['DEF'].astype(float)
      df2['XYZ']=df2['XYZ'].astype(float)
      
      cols = ['ABC', 'DEF', 'XYZ']
      df3 = df1.copy()
      df3[cols]=df1[cols].mul(df2[cols].values)
      print(df3)
      

      输出

               Date  ABC  DEF  XYZ
      0  2020-01-31  1.5  1.6  0.6
      1  2020-02-31  0.5  1.2  1.5
      2  2020-03-31  2.0  0.8  1.8
      3  2020-04-31  1.0  0.8  2.1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 2015-08-28
        • 1970-01-01
        • 2020-07-03
        • 1970-01-01
        相关资源
        最近更新 更多