将两个熊猫数据框与两个条件组合

时间:2020-10-09 18:32:30

标签: python pandas dataframe

我有两个熊猫数据框,我想结合检查两个条件。

Dataframe1:

import pandas as pd 
data = [['Z085', '2020-08', 1.33], ['Z086', '2020-08', 1.83], ['Z086', '2020-09', 1.39]] 
df1 = pd.DataFrame(data, columns = ['SN', 'Date', 'Value']) 

enter image description here

Dataframe2:

data = [['Z085', '2020-08', 0.34], ['Z085', '2020-09', 0.83], ['Z086', '2020-09', 0.29]] 
df2 = pd.DataFrame(data, columns = ['SN', 'Date', 'ValueX']) 
df2 

enter image description here

我想合并或追加或加入它们以便获得以下数据框: 如果“ SN”和“日期”相等,则将添加值(“ Value”和“ ValueX”)。

enter image description here

我不确定是否需要新的数据帧或将df2映射到df1。

这是我尝试过的:

df1['ValueX'] = df1[('Date', 'SN')].map(df2_mean.set_index('Date', 'SN')['ValueX'])

使用一个条件(例如:日期)可以正常工作,但是我无法设置两个条件。

2 个答案:

答案 0 :(得分:1)

这只是一个merge()操作。不要将列称为“条件”,只需说“合并SN,日期列”即可。

但是pandas(v1.1.4)有一个错误(默认是在执行排序时使用反向键,即“升序”),因此您不能依赖它;请注意,下面的注释按“日期”和“ SN”排序,即:错误路线:

>>> dfnew_bad = df1.merge(df2, on=['SN','Date'], how='outer')

     SN     Date  Value  ValueX
0  Z085  2020-08   1.33    0.34
1  Z086  2020-08   1.83     NaN
2  Z086  2020-09   1.39    0.29
3  Z085  2020-09    NaN    0.83

因此,在您的情况下,要先按SN依次获得正确的订单

dfnew_good = df1.merge(df2, on=['SN','Date'], how='outer', sort=False).sort_values(['SN', 'Date'])
     SN     Date  Value  ValueX
0  Z085  2020-08   1.33    0.34
3  Z085  2020-09    NaN    0.83
1  Z086  2020-08   1.83     NaN
2  Z086  2020-09   1.39    0.29

请注意,有一个标记.sort_values(ascending=True)但没有pd.merge() 您也可以先执行pd.merge(..., sort=False)然后执行dfnew_workaround.sort_index(..., inplace=True)

答案 1 :(得分:1)

方法1:merge

df_new = df1.merge(df2, on=['SN','Date'],how='outer', sort=True)
print(df_new)

方法2:join

df_new = df1.join(df2.set_index(['SN','Date']), on=['SN','Date'],how='outer', sort=True)
print(df_new)

在这种情况下,另一种可能的方式是使用pd.concat

df_new = pd.concat([df1.set_index(['SN','Date']),df2.set_index(['SN','Date'])],axis=1).reset_index()

两种情况下的输出

     SN     Date  Value  ValueX
0  Z085  2020-08   1.33    0.34
3  Z085  2020-09    NaN    0.83
1  Z086  2020-08   1.83     NaN
2  Z086  2020-09   1.39    0.29