[英]Concatenate multiple pandas series efficiently
我知道我可以使用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
我可以有效地合並多個系列嗎?
謝謝
要垂直組合系列,請使用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')]
假設您使用combine_first
的行為來按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
同意@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
如果您希望將一個系列的值優先於另一個系列的值,則可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.