如何从pandas中的两个数据帧进行条件映射

如何从pandas中的两个数据帧进行条件映射,pandas,Pandas,我有以下两个数据帧在熊猫 df1 date tank quantity 2018-04-01 1 234 2018-04-02 1 343 2018-04-03 1 334 2018-04-04 1 143 2018-04-05 1 237 2018-04-06 1 234 2018-04-07 1

我有以下两个数据帧在熊猫

df1

date         tank        quantity
2018-04-01   1           234
2018-04-02   1           343
2018-04-03   1           334
2018-04-04   1           143
2018-04-05   1           237
2018-04-06   1           234
2018-04-07   1           last observation
2018-04-01   2           234
2018-04-02   2           343
2018-04-03   2           334
2018-04-04   2           143
2018-04-05   2           237
2018-04-06   2           234
2018-04-07   2           last observation

df2
date         tank        quantity
2018-04-01   1           221
2018-04-02   1           200
2018-04-03   1           100
2018-04-04   1           123
2018-04-05   1           234.56
2018-04-06   1           324.67
2018-04-07   1           324.67
2018-04-01   2           221
2018-04-02   2           221.23 
2018-04-03   2           222.21
2018-04-04   2           453
2018-04-05   2           443
2018-04-06   2           234
2018-04-07   2           456
我想要的数据帧如下所示

 df1

 date         tank        quantity
 2018-04-01   1           234
 2018-04-02   1           343
 2018-04-03   1           334
 2018-04-04   1           143
 2018-04-05   1           237
 2018-04-06   1           234
 2018-04-07   1           324.67
 2018-04-01   2           234
 2018-04-02   2           343
 2018-04-03   2           334
 2018-04-04   2           143
 2018-04-05   2           237
 2018-04-06   2           234
 2018-04-07   2           456
我只想替换df2中的值,其中quantity列的值是df1中的
last observation


如何在pandas中执行此操作?

如果在
数据帧中有相同的
日期
s和
储罐
值以及相同的索引

df1.loc[df1['quantity'].eq('last observation'), 'quantity'] = df2['quantity']
df1['quantity'] = df1['quantity'].astype(float)
print (df1)
          date  tank  quantity
0   2018-04-01     1    234.00
1   2018-04-02     1    343.00
2   2018-04-03     1    334.00
3   2018-04-04     1    143.00
4   2018-04-05     1    237.00
5   2018-04-06     1    234.00
6   2018-04-07     1    324.67
7   2018-04-01     2    234.00
8   2018-04-02     2    343.00
9   2018-04-03     2    334.00
10  2018-04-04     2    143.00
11  2018-04-05     2    237.00
12  2018-04-06     2    234.00
13  2018-04-07     2    456.00
如果没有,请先使用左连接的
合并
,然后用新连接的列替换:

df = pd.merge(df1, df2, on=['date','tank'], how='left', suffixes=('_',''))

df1.loc[df1['quantity'].eq('last observation'), 'quantity'] = df['quantity']
df1['quantity'] = df1['quantity'].astype(float)
print (df1)
          date  tank  quantity
0   2018-04-01     1    234.00
1   2018-04-02     1    343.00
2   2018-04-03     1    334.00
3   2018-04-04     1    143.00
4   2018-04-05     1    237.00
5   2018-04-06     1    234.00
6   2018-04-07     1    324.67
7   2018-04-01     2    234.00
8   2018-04-02     2    343.00
9   2018-04-03     2    334.00
10  2018-04-04     2    143.00
11  2018-04-05     2    237.00
12  2018-04-06     2    234.00
13  2018-04-07     2    456.00
使用:

或:

或:

1.)您应该首先使用
merge
date
tank
上连接两个帧,以查找类似的记录:

df = pd.merge(df1, df2, on=['date','tank'])
Out[505]: 
          date  tank        quantity_x  quantity_y
0   2018-04-01     1               234      221.00
1   2018-04-02     1               343      200.00
2   2018-04-03     1               334      100.00
3   2018-04-04     1               143      123.00
4   2018-04-05     1               237      234.56
5   2018-04-06     1               234      324.67
6   2018-04-07     1  last observation      324.67
7   2018-04-01     2               234      221.00
8   2018-04-02     2               343      221.23
9   2018-04-03     2               334      222.21
10  2018-04-04     2               143      453.00
11  2018-04-05     2               237      443.00
12  2018-04-06     2               234      234.00
13  2018-04-07     2  last observation      456.00
2.)现在使用
np.where
替换
上一次观察的值

df['quantity_x'] = np.where(df['quantity_x']=='last observation', df['quantity_y'], df['quantity_x'])
df.drop('quantity_y', 1, inplace=True)
df.columns = ['date','tank','quantity']

In [515]: df
Out[515]: 
          date  tank   quantity
0   2018-04-01     1        234
1   2018-04-02     1        343
2   2018-04-03     1        334
3   2018-04-04     1        143
4   2018-04-05     1        237
5   2018-04-06     1        234
6   2018-04-07     1     324.67
7   2018-04-01     2        234
8   2018-04-02     2        343
9   2018-04-03     2        334
10  2018-04-04     2        143
11  2018-04-05     2        237
12  2018-04-06     2        234
13  2018-04-07     2        456

如果在
df1
df2
中观察值的数量不同怎么办?@Neil-Necesary首先创建
多索引
,然后应用解决方案
df1['quantity'] = df1['quantity'].where(df1['quantity'].ne('last observation'), 
                                        df2['quantity']).astype(float)
df = pd.merge(df1, df2, on=['date','tank'])
Out[505]: 
          date  tank        quantity_x  quantity_y
0   2018-04-01     1               234      221.00
1   2018-04-02     1               343      200.00
2   2018-04-03     1               334      100.00
3   2018-04-04     1               143      123.00
4   2018-04-05     1               237      234.56
5   2018-04-06     1               234      324.67
6   2018-04-07     1  last observation      324.67
7   2018-04-01     2               234      221.00
8   2018-04-02     2               343      221.23
9   2018-04-03     2               334      222.21
10  2018-04-04     2               143      453.00
11  2018-04-05     2               237      443.00
12  2018-04-06     2               234      234.00
13  2018-04-07     2  last observation      456.00
df['quantity_x'] = np.where(df['quantity_x']=='last observation', df['quantity_y'], df['quantity_x'])
df.drop('quantity_y', 1, inplace=True)
df.columns = ['date','tank','quantity']

In [515]: df
Out[515]: 
          date  tank   quantity
0   2018-04-01     1        234
1   2018-04-02     1        343
2   2018-04-03     1        334
3   2018-04-04     1        143
4   2018-04-05     1        237
5   2018-04-06     1        234
6   2018-04-07     1     324.67
7   2018-04-01     2        234
8   2018-04-02     2        343
9   2018-04-03     2        334
10  2018-04-04     2        143
11  2018-04-05     2        237
12  2018-04-06     2        234
13  2018-04-07     2        456