Python DataFrame:根据第三列中的值确定的动态列更新一列值

Python DataFrame:根据第三列中的值确定的动态列更新一列值,python,pandas,dataframe,Python,Pandas,Dataframe,考虑以下从字典创建的数据帧 d = { 'p_symbol': ['A','B','C','D','E'] , 'p_volume': [0,0,0,0,0] , 'p_exchange': ['IEXG', 'ASE', 'PSE', 'NAS', 'NYS'] , 'p_volume_rh': [1000,1000,1000,1000,1000] , 'p_volume.1': [2000,2000,2000,2000,2000] , 'p_

考虑以下从字典创建的数据帧

d = { 'p_symbol': ['A','B','C','D','E']
     , 'p_volume': [0,0,0,0,0]
     , 'p_exchange': ['IEXG', 'ASE', 'PSE', 'NAS', 'NYS']
     , 'p_volume_rh': [1000,1000,1000,1000,1000]
     , 'p_volume.1': [2000,2000,2000,2000,2000]
     , 'p_volume.2': [3000,3000,3000,3000,3000]
     , 'p_volume.3': [4000,4000,4000,4000,4000]
     , 'p_volume.4': [5000,5000,5000,5000,5000]
     }

snapshot = pd.DataFrame(d)
我需要根据p_exchange中的值,将p_volume中的值设置为最后5个p_volume*列之一的值。我需要这样做,因为数据是从我无法控制的第三方供应商API返回的

我已经尝试设置一个字典,该字典在p_exchange中给定值,并为我提供列名和结果代码

us_primary_exchange_map = {
    "NYS": "xp_volume_rh"
    , "NAS": "xp_volume.1"
    , "PSE": "xp_volume.2"
    , "ASE": "xp_volume.3"
    , "IEXG": "xp_volume.4"
    }

snapshot["p_volume"] = snapshot[us_primary_exchange_map[snapshot["p_exchange"]]])
但这不起作用


有人能帮我吗?有没有一种简单的方法可以做到这一点,而不必重复行?

我希望我正确理解了你的问题(而且
xp\u volume\u*
是一种打字错误,应该是
p\u volume\u*
而不是
x
):

印刷品:

  p_symbol  p_volume p_exchange  ...  p_volume.2  p_volume.3  p_volume.4
0        A      5000        NYS  ...        3000        4000        5000
1        B      4000        ASE  ...        3000        4000        5000
2        C      3000        PSE  ...        3000        4000        5000
3        D      2000        NAS  ...        3000        4000        5000
4        E      1000        NYS  ...        3000        4000        5000

[5 rows x 8 columns]
您可以与参数axis=1一起使用,在数据帧行上应用函数:

snapshot['p_volume'] = snapshot.apply(lambda row: snapshot.loc[row.name,
us_primary_exchange_map[row['p_exchange']]], axis=1)
您的数据帧将如下所示:

  p_symbol  p_volume p_exchange  p_volume_rh  p_volume.1  p_volume.2  \
0        A      5000       IEXG         1000        2000        3000   
1        B      4000        ASE         1000        2000        3000   
2        C      3000        PSE         1000        2000        3000   
3        D      2000        NAS         1000        2000        3000   
4        E      1000        NYS         1000        2000        3000   

   p_volume.3  p_volume.4  
0        4000        5000  
1        4000        5000  
2        4000        5000  
3        4000        5000  
4        4000        5000  

我不确定它是否比迭代行更有效,但我认为它更漂亮。

是的,输入错误。谢谢,这很有魅力。它实际上比在行上迭代更有效吗?还是更干净/更漂亮?@ChadDale通常,pandas数据帧/系列方法比手动迭代行更有效。但唯一确定的方法是对其进行基准测试。
  p_symbol  p_volume p_exchange  p_volume_rh  p_volume.1  p_volume.2  \
0        A      5000       IEXG         1000        2000        3000   
1        B      4000        ASE         1000        2000        3000   
2        C      3000        PSE         1000        2000        3000   
3        D      2000        NAS         1000        2000        3000   
4        E      1000        NYS         1000        2000        3000   

   p_volume.3  p_volume.4  
0        4000        5000  
1        4000        5000  
2        4000        5000  
3        4000        5000  
4        4000        5000