代码之家  ›  专栏  ›  技术社区  ›  A.E

如何垂直堆叠多个熊猫系列[复制]

  •  -1
  • A.E  · 技术社区  · 5 年前

    我知道我可以用 combine_first

    series1 = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
    series2 = pd.Series([1,2,3,4,5],index=['f','g','h','i','j'])
    series3 = pd.Series([1,2,3,4,5],index=['k','l','m','n','o'])
    
    Combine1 = series1.combine_first(series2)
    print(Combine1
    

    输出:

    a    1.0
    b    2.0
    c    3.0
    d    4.0
    e    5.0
    f    1.0
    g    2.0
    h    3.0
    i    4.0
    j    5.0
    dtype: float64
    

    如果我需要合并3个或更多的序列怎么办?

    print(series1 + series2 + series3) 产量:

    a   NaN
    b   NaN
    c   NaN
    d   NaN
    e   NaN
    f   NaN
    ...
    dtype: float64
    

    我可以不使用 多次?

    谢谢

    0 回复  |  直到 5 年前
        1
  •  10
  •   cs95 abhishek58g    5 年前

    将序列与非重叠索引组合

    pd.concat .

    # Setup
    series_list = [
        pd.Series(range(1, 6), index=list('abcde')),
        pd.Series(range(1, 6), index=list('fghij')),
        pd.Series(range(1, 6), index=list('klmno'))
    ]
    

    pd.concat(series_list)
    
    a    1
    b    2
    c    3
    d    4
    e    5
    f    1
    g    2
    h    3
    i    4
    j    5
    k    1
    l    2
    m    3
    n    4
    o    5
    dtype: int64
    

    与重叠索引结合

    series_list = [
        pd.Series(range(1, 6), index=list('abcde')),
        pd.Series(range(1, 6), index=list('abcde')),
        pd.Series(range(1, 6), index=list('kbmdf'))
    ]
    

    pd.concat(series_list, axis=1, sort=False).sum(axis=1)
    
    a     2.0
    b     6.0
    c     6.0
    d    12.0
    e    10.0
    k     1.0
    m     3.0
    f     5.0
    dtype: float64
    

    或者,如果只想获取第一个/最后一个值(当存在重复值时),只需在索引上删除重复值。

    res = pd.concat(series_list, axis=0)
    # keep first value
    res[~res.index.duplicated(keep='first')]
    # keep last value
    res[~res.index.duplicated(keep='last')]
    
        2
  •  3
  •   miradulo    7 年前

    假设你在使用 combine_first 先合并 是的,您可以使用lambda表达式简洁地多次调用它。

    from functools import reduce
    l_series = [series1, series2, series3]
    reduce(lambda s1, s2: s1.combine_first(s2), l_series)
    

    当然,如果索引与当前示例中的索引一样是唯一的,则可以简单地使用 pd.concat 相反。

    series1 = pd.Series(list(range(5)),index=['a','b','c','d','e'])
    series2 = pd.Series(list(range(5, 10)),index=['a','g','h','i','j'])
    series3 = pd.Series(list(range(10, 15)),index=['k','b','m','c','o'])
    
    from functools import reduce
    l_series = [series1, series2, series3]
    print(reduce(lambda s1, s2: s1.combine_first(s2), l_series))
    
    # a     0.0
    # b     1.0
    # c     2.0
    # d     3.0
    # e     4.0
    # g     6.0
    # h     7.0
    # i     8.0
    # j     9.0
    # k    10.0
    # m    12.0
    # o    14.0
    # dtype: float64
    
        3
  •  0
  •   Vaishali    7 年前

    如果希望一个序列的值优先于另一个序列的值,可以先使用combine_。它通常用于填充第一个序列中缺少的值。我不确定您的示例中预期的输出是什么,但是看起来您可以使用concat

    pd.concat([series1, series2, series3])
    

    a    1
    b    2
    c    3
    d    4
    e    5
    f    1
    g    2
    h    3
    i    4
    j    5
    k    1
    l    2
    m    3
    n    4
    o    5
    
        4
  •  0
  •   White    7 年前

    同意@codespeed在他的回答中所指出的。

    我认为这将取决于用户的需求。如果序列索引没有重叠,concat将是一个更好的选择。(正如最初发布的问题,没有索引重叠,那么concat将是一个更好的选择)

    i、 e.(注系列3与系列1相同,系列2与系列4相同)

    import pandas as pd
    import numpy as np
    
    
    series1 = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
    series2 = pd.Series([2,3,4,4,5],index=['a','b','c','i','j'])
    series3 = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
    series4 = pd.Series([2,3,4,4,5],index=['a','b','c','i','j'])
    
    
    print(series1.combine_first(series2))
    
    
    
    a    1.0
    b    2.0
    c    3.0
    d    4.0
    e    5.0
    i    4.0
    j    5.0
    dtype: float64
    
    
    
    print(series4.combine_first(series3))
    
    
    
    a    2.0
    b    3.0
    c    4.0
    d    4.0
    e    5.0
    i    4.0
    j    5.0
    dtype: float64