在已存在的列表"系列"中添加一个"系列"元素



假设我有一系列列表对象和另一系列值,例如

a = pd.Series([
[1],
[1, 2, 3],
[4, 5],
[],
[2],
[3, 6],
])
b = pd.Series([10, 20, 30, 40, 50, 60])

我希望将b元素附加到a,即获得

result = pd.Series([
[1, 10],
[1, 2, 3, 20],
[4, 5, 30],
[40],
[2, 50],
[3, 6, 60],
])

做这件事最好的方法是什么?

注意,如果pd.Seriespd.array对象(或其他东西)比list对象更容易,那就好了。

作为一个侧面点,是否有任何简单的方法从aresult等系列中的单个列表中删除NaN值?

您可以使用zip,它通常会比apply:

快。
pd.Series([lst + [e] for lst, e in zip(a, b)])
0          [1, 10]
1    [1, 2, 3, 20]
2       [4, 5, 30]
3             [40]
4          [2, 50]
5       [3, 6, 60]
dtype: object

修改a:

for lst, e in zip(a, b): lst.append(e)
a
0          [1, 10]
1    [1, 2, 3, 20]
2       [4, 5, 30]
3             [40]
4          [2, 50]
5       [3, 6, 60]
dtype: object

基于apply的基准测试:

timeit("a + b.apply(lambda x : [x])", number=100, globals=globals())
0.11637999999948079
timeit("pd.Series([lst + [e] for lst, e in zip(a, b)])", number=100, globals=globals())
0.04336999999941327

删除null值:

a = pd.Series([
[1],
[1, 2, 3, np.nan],
[4, 5],
[],
[2],
[3, np.nan, 6],
])
a
0               [1]
1    [1, 2, 3, nan]
2            [4, 5]
3                []
4               [2]
5       [3, nan, 6]
dtype: object
a.apply(lambda lst: [x for x in lst if pd.notnull(x)])
0          [1]
1    [1, 2, 3]
2       [4, 5]
3           []
4          [2]
5       [3, 6]
dtype: object

使用apply将每个元素转换为一个列表,然后concat:

import pandas as pd
a = pd.Series([
[1],
[1, 2, 3],
[4, 5],
[],
[2],
[3, 6],
])
b = pd.Series([10, 20, 30, 40, 50, 60])

res = a + b.apply(lambda x : [x])
print(res)

0          [1, 10]
1    [1, 2, 3, 20]
2       [4, 5, 30]
3             [40]
4          [2, 50]
5       [3, 6, 60]
dtype: object

替代:

res = a + pd.Series(b.to_frame().to_numpy().tolist())

最新更新