【问题标题】:pandas conditionally updated from another dataframe熊猫有条件地从另一个数据框更新
【发布时间】:2018-04-15 01:41:05
【问题描述】:

我有两个数据帧,我需要有条件地更新第一个数据帧中的特定列。

df1 = pd.DataFrame([[1,'Foo',1,1,1,np.nan,np.nan,np.nan],[2,'Foo',2,2,2,np.nan,np.nan,np.nan],[3,'Bar',3,3,3,np.nan,np.nan,np.nan]], columns = ['Key','identifier','A','B','C','D','E','F'])

print df1

   Key identifier  A  B  C   D   E   F
0    1        Foo  1  1  1 NaN NaN NaN
1    2        Foo  2  2  2 NaN NaN NaN
2    3        Bar  3  3  3 NaN NaN NaN

df2 = pd.DataFrame([[1,np.nan,10,10,10,5,6,7],[2,np.nan,12,12,12,8,9,10],[3,np.nan,13,13,13,11,12,13]], columns = ['Key','identifier','A','B','C','D','E','F'])

print df2

   Key  identifier   A   B   C   D   E   F
0    1         NaN  10  10  10   5   6   7
1    2         NaN  12  12  12   8   9  10
2    3         NaN  13  13  13  11  12  13

df1 中的标识符列 =='Foo',我需要使用 df2 中的相应列更新 df1 列 D、E、F。如何有条件地更新这三列?

df3 = #code here

想要的输出:

print df3

   Key identifier  A  B  C    D    E     F
0    1        Foo  1  1  1  5.0  6.0   7.0
1    2        Foo  2  2  2  8.0  9.0  10.0
2    3        Bar  3  3  3  NaN  NaN   NaN

跟进

不如说,df1 如下:

df1 = pd.DataFrame([[1,'Foo',1,1,1,np.nan,np.nan,np.nan],[4,'Bar',4,4,4,np.nan,np.nan,np.nan],[2,'Foo',2,2,2,np.nan,np.nan,np.nan],[3,'Bar',3,3,3,np.nan,np.nan,np.nan]], columns = ['Key','identifier','A','B','C','D','E','F'])

现在 df1 和 df2 的长度不一样了,要更新的记录的位置也不匹配。这仍然如何工作?我得到以下输出:

df2[df1['identifier'] == 'Foo'].combine_first(df1)

Key identifier     A     B     C     D     E     F
0  1.0        Foo  10.0  10.0  10.0   5.0   6.0   7.0
1  4.0        Bar   4.0   4.0   4.0   NaN   NaN   NaN
2  3.0        Foo  13.0  13.0  13.0  11.0  12.0  13.0
3  3.0        Bar   3.0   3.0   3.0   NaN   NaN   NaN

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    在使用set_indexKey 设置为索引后,使用combine_first

    df1
    
        identifier  A  B  C   D   E   F
    Key                                
    1          Foo  1  1  1 NaN NaN NaN
    2          Foo  2  2  2 NaN NaN NaN
    3          Bar  3  3  3 NaN NaN NaN
    
    df2
    
         identifier   A   B   C   D   E   F
    Key                                    
    1           NaN  10  10  10   5   6   7
    2           NaN  12  12  12   8   9  10
    3           NaN  13  13  13  11  12  13
    

    df2[df1.eval('identifier == "Foo"')].combine_first(df1)
    
        identifier     A     B     C    D    E     F
    Key                                             
    1          Foo  10.0  10.0  10.0  5.0  6.0   7.0
    2          Foo  12.0  12.0  12.0  8.0  9.0  10.0
    3          Bar   3.0   3.0   3.0  NaN  NaN   NaN
    

    【讨论】:

    • 谢谢,这相当于下面的,对吗? df2[df1['identifier'] == 'Foo'].combine_first(df1)
    • @flyingmeatball 就是这样。我只是想变得可爱。
    • 谢谢 - 我添加了一个跟进,你能解释一下为什么如果 df1 有 4 个项目,df2 有 3 个项目并且它们的顺序不正确,为什么这仍然有效?
    • @flyingmeatball 那是因为它是基于索引组合的——在这种情况下是列索引。
    • 你很可爱:-)哈哈
    猜你喜欢
    • 1970-01-01
    • 2021-04-19
    • 2016-10-07
    • 2021-08-22
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    相关资源
    最近更新 更多