如何使用字典解释Pandas中的名词短语where从句

irlmq6kh  于 2023-02-17  发布在  其他
关注(0)|答案(4)|浏览(122)

我有以下 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_acol_bcol_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"}

有什么想法吗?

mzsu5hc0

mzsu5hc01#

您可以mapcol_id上字典的值,然后执行索引查找:

import numpy as np

idx, cols = pd.factorize(foo['col_id'].map(dict_cols_matching))

foo['col'] = foo.reindex(cols, axis=1).to_numpy()[np.arange(len(foo)), idx]

输出:

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
pu3pd22g

pu3pd22g2#

使用np.select函数将 * 条件 * 列表排列为 * 选择 * 列表:

foo['col'] = np.select([foo.col_id.eq("ffp"), foo.col_id.eq("hie"), foo.col_id.eq("ttt")],
                       [foo.col_a, 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
0tdrvxhp

0tdrvxhp3#

你可以使用lambda函数根据你的id来选择列,但是方法取决于列的顺序,如果你改变了顺序,调整参数3。

import pandas as pd
import numpy as np

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]})

idSet = np.unique(foo['col_id'].to_numpy()).tolist()
foo['col'] = foo.apply(lambda x: x[idSet.index(x.col_id)+3], axis=1)
display(foo)

产出

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
68bkxrlz

68bkxrlz4#

您可以将reset_index与rowwise apply结合使用:

foo[["col_id"]].reset_index().apply(lambda u: foo.loc[u["index"],dict_cols_matching[u["col_id"]]], axis=1)

相关问题