我有一个使用以下数据创建的数据框。
data = {'B1':[65, 41, 17, 7],
'B2':[28, 40, 47, 30],
'B3':[16, 29, 39, 44],
'L':[6, 6.5, 7, 7.5]
'U':[6.5, 7, 7.5, 8]}
df=pd.DataFrame(data)
我还有另一个数据框df1
,如下所示:
data1 = {'Value':[6, 6.5, 7, 7.5]}
df1=pd.DataFrame(data1)
对于df1
中的每一行,我想从df
中获取该行,其中该值介于'L'
和'U'
值之间,并获取该列的名称。其他列的最大值,并将其作为列添加到df1
中。例如,可以在下图中看到输出:
Image
这是我使用的代码:
maxval=[]
for index,row in df1.iterrows():
tmp_val=df[df.columns[0:3]][(row.Value>= df.L) &(row.Value<df.U)]
maxval.append(tmp_val.idxmax(axis=1))
然后我将此列添加到df1
。在这种情况下,我有一个包含300,000行的数据框,并且需要很长时间才能完成。还有其他方法可以更快地执行此操作吗?
答案 0 :(得分:1)
使用idxmax
:
df1.assign(max_col=df.idxmax(1))
Value max_col
0 6.0 B1
1 6.5 B1
2 7.0 B2
3 7.5 B3
我们可以使用基础argmax
和底层的numpy数组来加快速度:
df1.assign(max_col=df.columns[df.values.argmax(1)])
答案 1 :(得分:0)
IIUC,您的df['U']
被df['L']
移动了1。如果是这样,您仍然可以使用idxmax
,但使用pd.cut
:
row_map = pd.cut(df1['Value'], bins = [df['L'][0]] + df['U'].to_list(),
right=False,
labels=df.index)
df1['max_col'] = df.loc[row_map,df.columns[:3]].idxmax(1)
输出:
Value max_col
0 6.0 B1
1 6.5 B1
2 7.0 B2
3 7.5 B3