将2个熊猫数据框附加到行和列的子集

时间:2019-04-10 06:48:56

标签: python pandas

我有2个这样的数据框

$.get("https://ipinfo.io/8.8.8.8/country", function(response) {
    console.log(country[response]);
   })

所以,我的数据框看起来像这样

df = pd.DataFrame({"date":["2019-01-01", "2019-01-02", "2019-01-03", "2019-01-04"],
                   "A": [1., 2., 3., 4.],
                   "B": ["a", "b", "c", "d"]})
df["date"] = pd.to_datetime(df["date"])

df_new = pd.DataFrame({"date":["2019-01-02", "2019-01-03", "2019-01-04", "2019-01-05", "2019-01-06"],
                       "A": [2, 3.5, 4, 5., 6.],
                       "B": ["b", "c1", "d", "e", "f"]})
df_new["date"] = pd.to_datetime(df_new["date"])

从这些数据框中,我想以特定条件将df附加到df_new:

  1. 在两个数据框中都有日期的任何行,我们将这些行放在df_new

  2. 任何在df中提供日期但在df_new中不可用的行,我们在df中使用此类行

最后我的预期输出看起来像这样

df
-----------------------
date            A    B
2019-01-01      1    a
2019-01-02      2    b
2019-01-03      3    c
2019-01-04      4    d

df_new
----------------------
date            A    B
2019-01-02      2    b
2019-01-03      3.5  c1
2019-01-04      4    d
2019-01-05      5    e
2019-01-06      6    f

我可以考虑找到2个数据框之间的行差,但是当我考虑到date列时,这行不通。请问您有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:3)

使用concat并在DataFrame.drop_duplicatesdate列中删除重复项,最后在DataFrame.reset_index的情况下创建默认的uniqe索引值:

df = pd.concat([df, df_new]).drop_duplicates('date', keep='last').reset_index(drop=True)
print (df)
        date    A   B
0 2019-01-01  1.0   a
1 2019-01-02  2.0   b
2 2019-01-03  3.5  c1
3 2019-01-04  4.0   d
4 2019-01-05  5.0   e
5 2019-01-06  6.0   f

答案 1 :(得分:0)

您可以将pandas.DataFrame.mergeouter一起使用,然后使用drop_duplicates删除重复的行。

df1 = df_new.merge(df, how='outer', on=['date','A','B']).sort_values(by='date').drop_duplicates('date').reset_index(drop=True)

print(df1)

输出:

    A   B       date                                                                                                                 
0  1.0   a 2019-01-01                                                                                                                 
1  2.0   b 2019-01-02                                                                                                                 
2  3.5  c1 2019-01-03                                                                                                                 
3  4.0   d 2019-01-04                                                                                                                 
4  5.0   e 2019-01-05                                                                                                                 
5  6.0   f 2019-01-06