如何将数据框转换为一系列列表?

Bri*_*ian 20 python list series dataframe pandas

我不得不这样做几次,我总是感到沮丧.我有一个数据帧:

df = pd.DataFrame([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'], ['A', 'B', 'C', 'D'])

print df

   A  B  C  D
a  1  2  3  4
b  5  6  7  8
Run Code Online (Sandbox Code Playgroud)

我想df变成:

pd.Series([[1, 2, 3, 4], [5, 6, 7, 8]], ['a', 'b'])

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object
Run Code Online (Sandbox Code Playgroud)

我试过了

df.apply(list, axis=1)
Run Code Online (Sandbox Code Playgroud)

哪个让我回来了 df

这样做的方便/有效方法是什么?

jez*_*ael 20

如果需要更快的解决方案,您可以先转换DataFramenumpy arrayby values,然后转换为list并最后Series使用index 创建new df:

print (pd.Series(df.values.tolist(), index=df.index))
a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object
Run Code Online (Sandbox Code Playgroud)

具有小型DataFrame的计时:

In [76]: %timeit (pd.Series(df.values.tolist(), index=df.index))
1000 loops, best of 3: 295 µs per loop

In [77]: %timeit pd.Series(df.T.to_dict('list'))
1000 loops, best of 3: 685 µs per loop

In [78]: %timeit df.T.apply(tuple).apply(list)
1000 loops, best of 3: 958 µs per loop
Run Code Online (Sandbox Code Playgroud)

和大:

from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                  pd.MultiIndex.from_product([letters, letters]),
                  letters)

In [71]: %timeit (pd.Series(df.values.tolist(), index=df.index))
100 loops, best of 3: 2.06 ms per loop

In [72]: %timeit pd.Series(df.T.to_dict('list'))
1 loop, best of 3: 203 ms per loop

In [73]: %timeit df.T.apply(tuple).apply(list)
1 loop, best of 3: 506 ms per loop
Run Code Online (Sandbox Code Playgroud)


piR*_*red 8

熊猫尝试使数据帧很方便.因此,它将列表和数组解释为您要分割成列的内容.我不会抱怨,这几乎总是有帮助的.

我已经完成了以下两种方式之一.

选项1:

# Only works with a non MultiIndex
# and its slow, so don't use it
df.T.apply(tuple).apply(list)
Run Code Online (Sandbox Code Playgroud)

选项2:

pd.Series(df.T.to_dict('list'))
Run Code Online (Sandbox Code Playgroud)

两者都给你:

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object
Run Code Online (Sandbox Code Playgroud)

但是选项2更好地扩展.


定时

特定 df

在此输入图像描述

更大 df

from string import ascii_letters
letters = list(ascii_letters)
df = pd.DataFrame(np.random.choice(range(10), (52 ** 2, 52)),
                  pd.MultiIndex.from_product([letters, letters]),
                  letters)
Run Code Online (Sandbox Code Playgroud)

结果df.T.apply(tuple).apply(list)是错误的,因为该解决方案不适用于MultiIndex.

在此输入图像描述