如何从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