熊猫:将* multiple *设置为列表列

时间:2019-01-24 04:57:41

标签: python pandas

带有设置列的简单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

那么,在不遍历各列的情况下,我想做的是一线吗?

2 个答案:

答案 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)