根据包含列名称的列从数据框列中选择值

时间:2021-07-27 11:55:40

标签: python pandas dataframe select

例如,如果我有以下数据框

df = pd.DataFrame({'a':[0,1,2], 'b':[3,4,5], 'c':['a','a','b']})

我想制作一个结果列,以便输出

df1 = pd.DataFrame({'a':[0,1,2], 'b':[3,4,5], 'c':['a','a','b'], 'res':[0, 1, 5]})

如果“c”列包含值“a”等,则“res”列值取自“a”列。 实际上我有很多列所以我想避免硬编码 pd.where(df.c=='a', ...) 是否有一些惯用的方法来完成任务?

1 个答案:

答案 0 :(得分:0)

解决方案 1:使用 apply

每行使用pandas.DataFrame.apply获取索引并获取对应的值

df['res'] = df.apply(lambda s: s[s['c']], axis=1)

输出:

   a  b  c  res
0  0  3  a    0
1  1  4  a    1
2  2  5  b    5

方案二:直接切片

通过直接对底层 numpy 数组进行切片,这是一种更快的替代方法:

# first map the columns to their position (a->0, b->1…)
cols = {k:v for v,k in enumerate(df.columns)}
# slice the elements
df['res'] = df.values[df.index, df['c'].map(cols)]

解决方案 3

最后,使用 locnumpy.diag 获得对角线的有趣替代方法(警告:这是非常低效的内存):

import numpy as np
df['res'] = np.diag(df.loc[df.index, df['c']])