繁体   English   中英

Pandas - 使用可变列输入计算新列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM