代码之家  ›  专栏  ›  技术社区  ›  Christian Neverdal

我怎么能同时浓缩和填充呢?

  •  2
  • Christian Neverdal  · 技术社区  · 8 年前

    假设我有三个数据帧:

    from pandas import DataFrame
    
    df1 = DataFrame([
        [1],
        [3],
        [4]
    ],
        index=[1, 3, 4],
        columns=['value1']
    )
    
    df2 = DataFrame([
        [5],
        [6],
        [7],
    ],
        index=[5, 6, 7],
        columns=['value2']
    )
    
    df3 = DataFrame([
        [5, 9],
        [6, 10],
        [7, 11],
        [8, 12]
    ],
        index=[5, 6, 7, 8],
        columns=['value1', 'value2']
    )
    

    使用

    concat([df1, df2, df3], sort=True, axis=1)
    

    现在就给我

       value1  value2  value1  value2
    1     1.0     NaN     NaN     NaN
    3     3.0     NaN     NaN     NaN
    4     4.0     NaN     NaN     NaN
    5     NaN     5.0     5.0     9.0
    6     NaN     6.0     6.0    10.0
    7     NaN     7.0     7.0    11.0
    8     NaN     NaN     8.0    12.0
    

    现在,我怎样才能得到结果

       value1  value2
    1     1.0     NaN
    3     3.0     NaN
    4     4.0     NaN
    5     5.0     5.0
    6     5.0     6.0
    7     7.0     7.0
    8     8.0     12.0
    

    换言之,对于同名的列,如何将它们合并到“左边”?我正在寻找一个通用的解决方案,它可以接受任意数量的具有相同名称的多个列(以及具有仅出现一次的列名)。

    1 回复  |  直到 8 年前
        1
  •  4
  •   jezrael    8 年前

    使用 DataFrame.combine_first 以下内容:

    df = df1.combine_first(df2).combine_first(df3)
    print (df)
       value1  value2
    1     1.0     NaN
    3     3.0     NaN
    4     4.0     NaN
    5     5.0     5.0
    6     6.0     6.0
    7     7.0     7.0
    8     8.0    12.0
    

    更通用的解决方案 list of DataFrames 正在使用 reduce 以下内容:

    from functools import reduce
    
    dfs = [df1, df2, df3]
    df = reduce(lambda l,r: pd.DataFrame.combine_first(l,r), dfs)