【问题标题】:Pandas: merge two dataframes ignoring NaNPandas:合并两个忽略 NaN 的数据框
【发布时间】:2015-09-30 14:11:13
【问题描述】:

假设我有以下两个DataFrames

  X    Y    Z
1 0.0  0.0  0.0
2 1.0  2.0  3.0
3 4.0  2.0  0.0
4 NaN  NaN  NaN
5 NaN  NaN  NaN
6 NaN  NaN  NaN
7 NaN  NaN  NaN
8 NaN  NaN  NaN

  X.2  Y.2  Z.2
1 NaN  NaN  NaN
2 NaN  NaN  NaN
3 NaN  NaN  NaN
4 NaN  NaN  NaN
5 NaN  NaN  NaN
6 9.0  3.0  6.0
7 7.0  4.0  3.0
8 3.0  6.0  8.0

我想用第二个中的值填充第一个 DataFrame 中的缺失数据。结果应如下所示:

  X    Y    Z
1 0.0  0.0  0.0
2 1.0  2.0  3.0
3 4.0  2.0  0.0
4 NaN  NaN  NaN
5 NaN  NaN  NaN
6 9.0  3.0  6.0
7 7.0  4.0  3.0
8 3.0  6.0  8.0

如果可能的话,我想避免创建一个新的DataFrame,而是在原位填写第一个DataFrame

我该怎么做?

【问题讨论】:

    标签: python pandas merging-data


    【解决方案1】:

    您可以简单地使用update 继续,它会根据df2 的值填充第一个数据帧df1

    df2.columns = df1.columns
    
    df1.update(df2)
    
    In [118]: df1
    Out[118]:
        X   Y   Z
    1   0   0   0
    2   1   2   3
    3   4   2   0
    4 NaN NaN NaN
    5 NaN NaN NaN
    6   9   3   6
    7   7   4   3
    8   3   6   8
    

    【讨论】:

    • 像魅力一样工作!非常感谢!
    【解决方案2】:

    如果你把列排成一行,那么 fillna() 会这样做:

    df2.columns = df1.column
    df1.fillna(df2, inplace=True)
    df1
    
        X   Y   Z
    1   0   0   0
    2   1   2   3
    3   4   2   0
    4 NaN NaN NaN
    5 NaN NaN NaN
    6   9   3   6
    7   7   4   3
    8   3   6   8
    

    【讨论】:

      【解决方案3】:

      如果您重命名第二个数据框的列,则可以像这样使用 concat 和 groupby:

      In[96]: df1
      Out[96]: 
          X   Y   Z
      1   0   0   0
      2   1   2   3
      3   4   2   0
      4 NaN NaN NaN
      5 NaN NaN NaN
      6 NaN NaN NaN
      7 NaN NaN NaN
      8 NaN NaN NaN
      
      In[101]: df2
      Out[101]: 
          X   Y   Z
      1 NaN NaN NaN
      2 NaN NaN NaN
      3 NaN NaN NaN
      4 NaN NaN NaN
      5 NaN NaN NaN
      6   9   3   6
      7   7   4   3
      8   3   6   8
      
      In[102]: pd.concat([df1,df2]).groupby(level=0).sum()
      Out[102]: 
          X   Y   Z
      1   0   0   0
      2   1   2   3
      3   4   2   0
      4 NaN NaN NaN
      5 NaN NaN NaN
      6   9   3   6
      7   7   4   3
      8   3   6   8
      

      【讨论】:

        【解决方案4】:
        with python if dataframe could be list of lists
        
        d1 =[[1,0.0, 0.0, 0.0],
            [2,1.0, 2.0, 3.0],
            [3,4.0, 2.0, 0.0],
            [4,'NaN', 'NaN', 'NaN'],
            [5,'NaN', 'NaN', 'NaN'],
            [6,'NaN', 'NaN', 'NaN'],
            [7,'NaN', 'NaN', 'NaN'],
            [8,'NaN', 'NaN', 'NaN']]
        
        
        d2 = [[1,'NaN', 'NaN', 'NaN'],
            [2,'NaN', 'NaN', 'NaN'],
            [3,'NaN', 'NaN', 'NaN'],
            [4,'NaN', 'NaN', 'NaN'],
            [5,'NaN', 'NaN', 'NaN'],
            [6,9.0, 3.0, 6.0],
            [7,7.0, 4.0, 3.0],
            [8,3.0, 6.0, 8.0]]
        
        
        def replace_row(l,ln):
        
            for i, el in enumerate(l):
                if el  == 'NaN':
                    l[i] = ln[i]
        
        
        for i,l1 in enumerate(d1):
            for j, l2 in enumerate(d2):
                if i == j:
                    replace_row(l1,l2)
        
        
        for el in d1:
            print(el)
        
        result in:
        
        [1, 0.0, 0.0, 0.0]
        [2, 1.0, 2.0, 3.0]
        [3, 4.0, 2.0, 0.0]
        [4, 'NaN', 'NaN', 'NaN']
        [5, 'NaN', 'NaN', 'NaN']
        [6, 9.0, 3.0, 6.0]
        [7, 7.0, 4.0, 3.0]
        [8, 3.0, 6.0, 8.0]
        

        【讨论】:

          猜你喜欢
          • 2020-03-12
          • 2016-01-14
          • 2014-11-26
          • 1970-01-01
          • 2015-10-17
          • 2018-03-14
          • 1970-01-01
          • 2017-11-24
          • 2021-10-24
          相关资源
          最近更新 更多