带有设置列的简单DataFrame:
df = pd.DataFrame({'a': [{0,1}, {1,2}, {}], 'b': [{1,2},{2,3,4}, {3}]})
df
a b
0 {0, 1} {1, 2}
1 {1, 2} {2, 3, 4}
2 {} {3}
我想将多个特定的集合列转换为列表列。我正在使用apply
,但这不起作用:
df[['a','b']].apply(lambda x: list(x))
a b
0 {0, 1} {1, 2}
1 {1, 2} {2, 3, 4}
2 {} {3}
它适用于单列/系列:
df['a'].apply(lambda x: list(x))
0 [0, 1]
1 [1, 2]
2 []
Name: a, dtype: object
在不涉及列表的其他DataFrame上,不同的功能当然可以按预期在多个列上工作:
df2 = pd.DataFrame({'a':[0,1,2], 'b':[3,4,5]})
df2[['a','b']].apply(lambda x: x + 1)
a b
0 1 4
1 2 5
2 3 6
那么,在不遍历各列的情况下,我想做的是一线吗?
答案 0 :(得分:4)
我认为您正在寻找applymap
。另外,lambda x: list(x)
可以简化为list
:
In [5]: df[['a', 'b']].applymap(list)
Out[5]:
a b
0 [0, 1] [1, 2]
1 [1, 2] [2, 3, 4]
2 [] [3]
答案 1 :(得分:2)
尝试使用嵌套列表理解来提高性能:
pd.DataFrame([[list(l) for l in r] for r in df.values],
index=df.index,
columns=df.columns)
a b
0 [0, 1] [1, 2]
1 [1, 2] [2, 3, 4]
2 [] [3]
在处理混合dtype时,我完全相信pure-python的功能。有关when循环胜过大熊猫的更多信息,请在这里查看我的文章:For loops with pandas - When should I care?
即使是很小的框架,差异也很明显:
%timeit df[['a', 'b']].applymap(list)
%%timeit
pd.DataFrame([[list(l) for l in r] for r in df.values],
index=df.index,
columns=df.columns)
3.41 ms ± 92 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
669 µs ± 63.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)