我有两个数据帧df1和df2.它们都包含时间序列数据,因此df1和df2中的某些日期可能相互交叉,其余日期则不相交.我的要求是对两个数据帧的操作,用df2中的值替换df1中的值,df2中的索引值在df2中不存在,并且添加df2中存在的索引的值而不是df1中的索引值.请考虑以下示例:
df1:
A B C D
0 A0 BO C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2:
A B C E
1 A4 B4 C4 E4
2 A5 B5 C5 E5
3 A6 B6 C6 E6
4 A7 B7 C7 E7
result df:
A B C D E
0 A0 BO C0 D0 Nan
1 A4 B4 C4 D4 E4
2 A5 B5 C5 D5 E5
3 A6 B6 C6 D6 E6
4 A7 B7 C7 D7 E7
Run Code Online (Sandbox Code Playgroud)
我尝试开发逻辑,第一步连接两个dfs,但导致重复索引的行,我不知道如何处理.怎么能实现这一目标?任何建议都会有帮助
编辑:一个更简单的情况是两个数据帧中的列名相同.因此,考虑到df2具有列D而不是E,其值为D4,D5,D6,D7.
连接产生以下结果:
concat(df1,df2,axis=1)
A B C D A B C D
0 A0 B0 C0 D0 NaN NaN NaN NaN
1 A1 B1 C1 D1 A4 B4 C4 D4
2 A2 B2 C2 D2 A5 B5 C5 D5
3 A3 B3 C3 D3 A6 B6 C6 D6
4 NaN NaN NaN NaN A7 B7 C7 D7
Run Code Online (Sandbox Code Playgroud)
现在,这会引入重复的列.传统的解决方案是遍历每一列,但我正在寻找更优雅的解决方案.任何想法,将不胜感激.
update 将与两个DataFrames的索引对齐:
df1.update(df2)
df1:
A B C D
0 A0 BO C0 D0
1 A1 B1 C1 D1
2 A2 B2 C2 D2
3 A3 B3 C3 D3
df2:
A B C D
1 A4 B4 C4 D4
2 A5 B5 C5 D5
3 A6 B6 C6 D6
4 A7 B7 C7 D7
>>> df1.update(df2)
A B C D
0 A0 BO C0 D0
1 A4 B4 C4 D4
2 A5 B5 C5 D5
3 A6 B6 C6 D6
Run Code Online (Sandbox Code Playgroud)
然后,您需要添加df1中不存在的df2中的值:
>>> df1.append(df2.loc[[i for i in df2.index if i not in df1.index], :])
Out[46]:
A B C D
0 A0 BO C0 D0
1 A4 B4 C4 D4
2 A5 B5 C5 D5
3 A6 B6 C6 D6
4 A7 B7 C7 D7
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4287 次 |
| 最近记录: |