有效组合多个熊猫系列

时间:2017-09-18 03:15:18

标签: python pandas series

我知道我可以使用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

我可以多次合并多个系列而不会多次使用combine_first吗?

由于

4 个答案:

答案 0 :(得分:6)

根据您的编辑,我认为您需要沿第一个轴连接,然后沿同一轴连接sum

def combine_multi(ser_list):
    return pd.concat([series1, series2, series3], 1).fillna(0).sum(1)

示例A 不同的索引

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'])

out = combine_multi([series1, series2, series3])
out

a     5.0
b    12.0
c    15.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

示例B 重叠索引

series1 = pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
series2 = pd.Series([1,2,3,4,5],index=['a','b','c','i','j'])
series3 = pd.Series([1,2,3,4,5],index=['k','b','m','d','f'])

out = combine_multi([series1, series2, series3])
out

a    2.0
b    6.0
c    6.0
d    8.0
e    5.0
f    5.0
i    4.0
j    5.0
k    1.0
m    3.0
dtype: float64

答案 1 :(得分:2)

假设您正在使用combine_first的行为按照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

答案 2 :(得分:0)

同意@codespeed在答案中指出的内容。

我认为这将取决于用户需求。如果确认系列索引没有重叠,则concat将是更好的选择。 (作为原始问题发布,没有索引重叠,那么concat将是更好的选择)

如果索引重叠,您可能需要考虑如何处理重叠,要覆盖哪个值。 (作为代码提供的示例,如果索引匹配不同的值,则需要注意combine_first)

即。 (注意series3与series1相同,series2与series4相同)

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

答案 3 :(得分:0)

如果您希望一个系列的值优先于另一个系列的值,则可以使用combine_first。它通常用于填充第一个系列中的缺失值。我不确定你的例子中的预期输出是什么,但看起来你可以使用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