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

24

我已经不止一次地这样做了,但总是感到沮丧。我有一个数据框:

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

我想把 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

我已经尝试过了

df.apply(list, axis=1)

有什么方便/有效的方法可以做到这一点?

只需将相同的 df 返回即可。

3个回答

22
您可以首先通过valuesDataFrame转换为numpy array,然后转换为列表,最后根据需要使用来自df的索引创建新的Series以获得更快的解决方案。
print (pd.Series(df.values.tolist(), index=df.index))
a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

处理小数据帧的时间:

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

并且拥有大规模:

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

9

pandas非常努力地使得创建数据框变得方便。因此,它将列表和数组解释为您想要拆分成列的内容。我不会抱怨,这几乎总是有帮助的。

我有两种方法来实现这个。

选项1:

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

选项2:

pd.Series(df.T.to_dict('list'))

两者都会给你:

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object

然而,选项2的扩展性更好。


时间

给定 df

enter image description here

更大的 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)

df.T.apply(tuple).apply(list) 的结果是错误的,因为这种解决方法在 MultiIndex 上不起作用。

进入图片描述


0

将Dataframe转换为列表

List_name =df_name.values.tolist()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接