熊猫根据另一个数据框列在列中设置值

时间:2021-03-23 05:26:21

标签: python pandas

假设我有两个熊猫数据框:

import pandas as pd

df1 = {'y1': [1, 2, 3, 4]}
df2 = {'y2': [3, 1, 2, 6]}

我想要的是如果 y2 中的值大于 y1 中的值,我想将 df2['y2'] 设置为相应的 df['y1']。当我尝试选择相应的列时:

df2[df2['y2'] > df1['y1']]

这是返回 True 而不是索引。我希望做这样的事情:

df2[df2['y2'] > df1['y1']]['y2'] = df1['y1'] 

3 个答案:

答案 0 :(得分:2)

如果两个 DataFrame 中的索引相同:

使用DataFrame.loc

df2.loc[df2['y2'] > df1['y1'], 'y2'] = df1['y1'] 
print (df2)
   y2
0   1
1   1
2   2
3   4

Series.whereSeries.mask

df2['y2'] = df1['y1'].where(df2['y2'].gt(df1['y1']), df2['y2'])
df2['y2'] = df2['y2'].mask(df2['y2'].gt(df1['y1']), df1['y1'])
print (df2)
   y2
0   1
1   1
2   2
3   4

答案 1 :(得分:2)

使用numpy.where

In [233]: import numpy as np

In [234]: df1 = pd.DataFrame({'y1': [1, 2, 3, 4]})
In [236]: df2 = pd.DataFrame({'y2': [3, 1, 2, 6]})

In [242]: df2['y2'] = np.where(df2.y2.gt(df1.y1), df1.y1, df2.y2)

In [243]: df2
Out[243]: 
   y2
0   1
1   1
2   2
3   4

答案 2 :(得分:2)

np.minimum

维护所有现有的 df2,但更新了 'y2' 中的列值

df2.assign(y2=np.minimum(df1.y1, df2.y2))

   y2
0   1
1   1
2   2
3   4

或者只是一个包含一列的新数据框

pd.DataFrame({'y2': np.minimum(df1.y1, df2.y2)})

   y2
0   1
1   1
2   2
3   4