假设我有一系列列表对象和另一系列值,例如
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.Series
的pd.array
对象(或其他东西)比list
对象更容易,那就好了。
作为一个侧面点,是否有任何简单的方法从a
或result
等系列中的单个列表中删除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())