我知道我可以使用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
吗?
由于
答案 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