根据其他数据框熊猫的值添加列

时间:2019-10-25 15:51:49

标签: python pandas dataframe

我有一个使用以下数据创建的数据框。

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行的数据框,并且需要很长时间才能完成。还有其他方法可以更快地执行此操作吗?

2 个答案:

答案 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