python—根据包含列名的列,从dataframe列中选择值

9jyewag0  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(424)

例如,如果我有以下 Dataframe

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。其中(df.c=='a',…)有什么惯用的方法来完成任务吗?

nwo49xxi

nwo49xxi1#

解决方案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

解决方案2:直接切片

下面是一个更快的选择,直接切片底层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']])

相关问题