簡體   English   中英

有效地連接多個熊貓系列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM