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