首页 > 解决方案 > 移动数据帧索引以匹配另一个数据帧

问题描述

我有两个数据框。我正在尝试用另一个数据框更新一个数据框。

df1好像:

            col2  col3 dept
date                       
2020-05-08    29    21    A
2020-05-09    56    12    B
2020-05-10    82    15    C
2020-05-11    13     9    D
2020-05-12    35    13    E
2020-05-13    53    87    F
2020-05-14    25     9    G
2020-05-15    23    63    H

看起来df2像:

            col2 dept
date                 
2020-05-08    64    A
2020-05-09    41    B
2020-05-10    95    C
2020-05-11    58    D
2020-05-12    89    E
2020-05-13    37    F
2020-05-14    24    G
2020-05-15    67    H

df1当两个数据框的索引中的日期匹配时,我可以df2毫无问题地更新:

df1 = df1.set_index('dept', append=True)
df2 = df2.set_index('dept', append=True)
df1.update(df2)
df1 = df1.reset_index(level='dept')
df2 = df2.reset_index(level='dept')

以上将 dept 带入索引,我更新df1df2

因此col2indf1更新为:

           dept  col2  col3
date                       
2020-05-07    A    64    21
2020-05-08    B    41    12
2020-05-09    C    95    15
2020-05-10    D    58     9
2020-05-11    E    89    13
2020-05-12    F    37    87
2020-05-13    G    24     9
2020-05-14    H    67    63

但是 - 当索引日期不同时,例如当 df2 看起来像:

            col2 dept
date                 
2020-05-07    64    A
2020-05-08    41    B
2020-05-09    95    C
2020-05-10    58    D
2020-05-11    89    E
2020-05-12    37    F
2020-05-13    24    G
2020-05-14    67    H

使用上面的代码df1不会使用来自 的值进行更新df2。当索引不同时,如何使用另一个数据框更新日期框?一个解决方案是使日期与 thendf2相同df1(但你将如何做到这一点)。

标签: pythonpandas

解决方案


您想df1df2索引(datedept)的组合上进行更新。

仅当您在数据帧中具有匹配的索引时,您的相同代码才能正常工作。

df1 之后的索引df1 = df1.set_index('dept', append=True)是:

In [160]: df1.index.tolist()                                                                                                                                                                                
Out[160]: 
[('2020-05-08', 'A'),
 ('2020-05-09', 'B'),
 ('2020-05-10', 'C'),
 ('2020-05-11', 'D'),
 ('2020-05-12', 'E'),
 ('2020-05-13', 'F'),
 ('2020-05-14', 'G'),
 ('2020-05-15', 'H')]

以你的第二个df2为例。df2之后的索引df2 = df2.set_index('dept', append=True)是:

In [159]: df2.index.tolist()                                                                                                                                                                                
Out[159]: 
[('2020-05-07', 'A'),
 ('2020-05-08', 'B'),
 ('2020-05-09', 'C'),
 ('2020-05-10', 'D'),
 ('2020-05-11', 'E'),
 ('2020-05-12', 'F'),
 ('2020-05-13', 'G'),
 ('2020-05-14', 'H')]

您可以看到两个数据帧的索引对于任何行都不匹配。因此,它没有更新。如果您有匹配的索引,您将从代码本身获得所需的输出。


推荐阅读