我有以下 Dataframe
import pandas as pd
foo = pd.DataFrame({'id': [1,1,1,2,2,2],
'time': [1,2,3,1,2,3],
'col_id': ['ffp','ffp','ffp', 'hie', 'hie', 'ttt'],
'col_a': [1,2,3,4,5,6],
'col_b': [-1,-2,-3,-4,-5,-6],
'col_c': [10,20,30,40,50,60]})
id time col_id col_a col_b col_c
0 1 1 ffp 1 -1 10
1 1 2 ffp 2 -2 20
2 1 3 ffp 3 -3 30
3 2 1 hie 4 -4 40
4 2 2 hie 5 -5 50
5 2 3 ttt 6 -6 60
我想在foo
中创建一个新的col
,它将取col_a
、col_b
或col_c
的值,具体取决于col_id
的值。
我正在执行以下操作:
foo['col'] = np.where(foo.col_id == "ffp", foo.col_a,
np.where(foo.col_id == "hie",foo.col_b, foo.col_c))
它给出了
id time col_id col_a col_b col_c col
0 1 1 ffp 1 -1 10 1
1 1 2 ffp 2 -2 20 2
2 1 3 ffp 3 -3 30 3
3 2 1 hie 4 -4 40 -4
4 2 2 hie 5 -5 50 -5
5 2 3 ttt 6 -6 60 60
由于我有很多专栏,我想知道是否有一个更干净的方法来做到这一点,例如使用字典:
dict_cols_matching = {"ffp" : "col_a", "hie": "col_b", "ttt": "col_c"}
有什么想法吗?
4条答案
按热度按时间mzsu5hc01#
您可以
map
col_id
上字典的值,然后执行索引查找:输出:
pu3pd22g2#
使用
np.select
函数将 * 条件 * 列表排列为 * 选择 * 列表:0tdrvxhp3#
你可以使用lambda函数根据你的id来选择列,但是方法取决于列的顺序,如果你改变了顺序,调整参数3。
产出
68bkxrlz4#
您可以将reset_index与rowwise apply结合使用: