我有以下两个数据帧:
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按预期工作。我的第一个数据框是主要的。第二种是更新。它应该替换第一个中的相应值,同时添加新记录(如果有的话)。
我怎么能这样做?
答案 0 :(得分:4)
您可以使用combine_first
,如果某个索引的dtype
为object
转换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)
的另一种解决方案
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)
append
和drop_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