有效组合多个熊猫系列

Kan*_*hew 4 python concat series pandas

我明白我可以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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

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

我理解使用以下代码:print(series1 + series2 + series3)yield:

a   NaN
b   NaN
c   NaN
d   NaN
e   NaN
f   NaN
...
dtype: float64
Run Code Online (Sandbox Code Playgroud)

我可以有效地合并多个系列而不需要combine_first多次使用吗?

谢谢

cs9*_*s95 9

根据您的编辑,我相信您需要沿第一个轴连接,然后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'))
]
Run Code Online (Sandbox Code Playgroud)

例A(不同指数)

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
Run Code Online (Sandbox Code Playgroud)

例B(重叠指数)

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'))
]
Run Code Online (Sandbox Code Playgroud)


mir*_*ulo 5

假设您使用 的行为combine_first按预期顺序对系列值进行优先级排序combine_first,您可以使用 lambda 表达式简洁地对其进行多次调用。

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

当然,如果索引像当前示例中那样是唯一的,您可以简单地使用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
Run Code Online (Sandbox Code Playgroud)