例如,如果我有以下数据框
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', ...) 是否有一些惯用的方法来完成任务?
答案 0 :(得分:0)
每行使用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)]
最后,使用 loc
和 numpy.diag
获得对角线的有趣替代方法(警告:这是非常低效的内存):
import numpy as np
df['res'] = np.diag(df.loc[df.index, df['c']])