[英]Pandas - calculate new column with variable column input
继承人的问题......想象一下以下数据帧作为例子:
df = pd.DataFrame({'col1': [1, 2, 3, 4, 5], 'col2': [3, 4, 5, 6, 7],'col3': [3, 4, 5, 6, 7],'col4': [1, 2, 3, 3, 2]})
现在,我想添加另一列“col 5”,其计算方法如下:
如果“col4”的值为1,则在索引为1的列中给出相应的值(在本例中为“col2”),如果“col4”为2,则在索引为2的列中给出相应的值(即在这种情况下为“col3”)等
我尝试了以下和它的变化,但我似乎无法得到正确的结果
df["col5"] = df.apply(lambda x: df.iloc[x,df[df.columns[df["col4"]]]])
任何帮助深表感谢!
如果'col4'
是列索引的指示符,则可以使用:
df['col5'] = df.apply(lambda x: x[df.columns[x['col4']]], axis=1)
df
# col1 col2 col3 col4 col5
#0 1 3 3 1 3
#1 2 4 4 2 4
#2 3 5 5 3 3
#3 4 6 6 3 3
#4 5 7 7 2 7
您可以使用NumPy进行花哨的索引,并完全避免使用Python级循环:
df['col5'] = df.iloc[:, :4].values[np.arange(df.shape[0]), df['col4']]
print(df)
col1 col2 col3 col4 col5
0 1 3 3 1 3
1 2 4 4 2 4
2 3 5 5 3 3
3 4 6 6 3 3
4 5 7 7 2 7
对于较大的数据帧,您应该会看到显着的性能优势:
df = pd.concat([df]*10**4, ignore_index=True)
%timeit df.apply(lambda x: x[df.columns[x['col4']]], axis=1) # 2.36 s per loop
%timeit df.iloc[:, :4].values[np.arange(df.shape[0]), df['col4']] # 1.01 ms per loop
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.