Pandas - 合并两个具有不同行数的数据帧

时间:2017-05-08 20:44:24

标签: python pandas

我有以下两个数据帧:

DF:

              value
period
2000-01-01    100
2000-04-01    200
2000-07-01    300
2000-10-01    400
2001-01-01    500

DF1:

              value
period
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700

这是所需的输出:

DF:

              value
period
2000-01-01    100
2000-04-01    200
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700

我在df1和df2都有set_index(['period'])。我还尝试了一些东西,包括concat和在创建新列之后的where语句但是notting按预期工作。我的第一个数据框是主要的。第二种是更新。它应该替换第一个中的相应值,同时添加新记录(如果有的话)。

我怎么能这样做?

4 个答案:

答案 0 :(得分:4)

您可以使用combine_first,如果某个索引的dtypeobject转换to_datetime,如果df1.index始终在df.index,则效果很好}:

print (df.index.dtype)
object

print (df1.index.dtype)
object

df.index = pd.to_datetime(df.index)
df1.index = pd.to_datetime(df1.index)

df = df1.combine_first(df)
#if necessary int columns
#df = df1.combine_first(df).astype(int)
print (df)
            value
period           
2000-01-01  100.0
2000-04-01  200.0
2000-07-01  350.0
2000-10-01  450.0
2001-01-01  550.0
2001-04-01  600.0
2001-07-01  700.0

如果没有,则必须首先按intersection过滤:

df = df1.loc[df1.index.intersection(df.index)].combine_first(df)

numpy.setdiff1dconcat

的另一种解决方案
df = pd.concat([df.loc[np.setdiff1d(df.index, df1.index)], df1])
print (df)
            value
period           
2000-01-01    100
2000-04-01    200
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700

答案 1 :(得分:3)

这就是你想要的吗?

In [151]: pd.concat([df1, df.loc[df.index.difference(df1.index)]]).sort_index()
Out[151]:
            value
period
2000-01-01    100
2000-04-01    200
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700

PS确保两个索引具有相同的dtype - 使用datetime方法将它们转换为pd.to_datetime() dtype更好

答案 2 :(得分:3)

appenddrop_duplicates

的另一个选项
d1 = df1.append(df)
d1[~d1.index.duplicated()]

            value
period           
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700
2000-01-01    100
2000-04-01    200

答案 3 :(得分:0)

我使用pd.concat()函数连接数据框,然后删除重复项以获得结果。

df_con = pd.concat([df, df1])
df_con.drop_duplicates(subset="period",keep="last",inplace=True)
print(df_con)

       period  value
0  2000-01-01    100
1  2000-04-01    200
0  2000-07-01    350
1  2000-10-01    450
2  2001-01-01    550
3  2001-04-01    600
4  2001-07-01    700

要将“句号”设置为索引,只需设置索引

即可
print(df_con.set_index("period"))

            value
period           
2000-01-01    100
2000-04-01    200
2000-07-01    350
2000-10-01    450
2001-01-01    550
2001-04-01    600
2001-07-01    700