【问题标题】:Multiplying row values based on column from another DataFrame基于来自另一个 DataFrame 的列乘以行值
【发布时间】:2022-01-20 04:32:58
【问题描述】:

我正在尝试根据另一个 DataFrame 的列更改 DataFrame 中的值。代码如下所示:

第一个数据帧:

df1 = pd.DataFrame({'Ticker':['M2NS Index', 'ECMSM2 Index','A23 VWYH Index'], 'Factor':[4,3,2]})
df1
    Ticker          Factor
0   M2NS Index           4
1   ECMSM2 Index         3
2   A23 VWYH Index       2

第二个数据框:

df2 = pd.DataFrame({'M2NS Index':[5,2,1], 'ECMSM2 Index':[5,2,1], 'A23 VWYH Index':[5,2,1]})
df2
    M2NS Index  ECMSM2 Index    A23 VWYH Index
0   5           5               5
1   2           2               2
2   1           1               1

我想将行值乘以 10^因子,其中因子在第一个表中。不同的列将与相关的因子相乘。我生成的框架如下所示:

df3 = pd.DataFrame({'M2NS Index':[50000,20000,10000], 'ECMSM2 Index':[5000,2000,1000], 'A23 VWYH Index':[500,200,100]})
df3
    
    M2NS Index  ECMSM2 Index    A23 VWYH Index
0   50000       5000            500
1   20000       2000            200
2   10000       1000            100

如果有人知道如何在不使用位置而是使用索引的情况下进行乘法运算,那就太好了!第二个数据帧中的列顺序可能与第一个数据帧中的行顺序不同。任何帮助将不胜感激!

【问题讨论】:

  • 我认为您的输入有误

标签: python pandas dataframe


【解决方案1】:

使用 Series 代替 df1,并在标准操作中利用索引对齐:

df3 = df2 * 10**df1.set_index('Ticker')['Factor']

输出:

   M2NS Index  ECMSM2 Index  A23 VWYH Index
0       50000          5000             500
1       20000          2000             200
2       10000          1000             100

【讨论】:

    【解决方案2】:

    您可以使用to_records(index=False) 将一对列中的数据转换为元组列表,以便使用for 循环轻松进行迭代。然后,您可以使用第一个循环变量来引用第二个 DataFrame 中的列。

    import pandas as pd
    
    df1 = pd.DataFrame({'Ticker':['M2NS Index', 'ECMSMS2 Index','A23 VWYH Index'], 'Factor':[4,3,2]})
    df2 = pd.DataFrame({'M2NS Index':[5,2,1], 'ECMSM2 Index':[5,2,1], 'A23 VWYH Index':[5,2,1]})
    # Make a copy of df2
    df3 = df2
    
    # Iterate over pairs of 'Ticker', 'Factor' from df1 rows
    for ticker, factor in df1[['Ticker', 'Factor']].to_records(index=False):
        # If there is a column in df2 with the same name as 'Ticker'
        if ticker in df2.columns:
            # Multiply by the factor of ten specified
            df3[ticker] = df2[ticker] * 10 ** factor
    

    输出:

           M2NS Index  ECMSM2 Index  A23 VWYH Index
    0           50000             5             500
    1           20000             2             200
    2           10000             1             100
    

    你问第二列发生了什么? ECMSMS2 Index 写在 df1 中,但 ECMSM2 Index (缺少第二个“S”)在 df2 中。您需要注意确保名称匹配,或者在 if 语句之后插入某种处理以匹配 x% 的字母匹配或类似的东西。如果没有if 语句,代码将按原样以KeyError 终止。

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2017-05-20
      相关资源
      最近更新 更多