如何将数据框变成一系列列表?

Posted

技术标签:

【中文标题】如何将数据框变成一系列列表?【英文标题】:How do I turn a dataframe into a series of lists? 【发布时间】:2016-12-07 09:08:48 【问题描述】:

我不得不多次这样做,但我总是很沮丧。我有一个数据框:

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

什么是方便/有效的方法?

【问题讨论】:

【参考方案1】:

您可以先通过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

小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

和大:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

数据框到列表的转换

List_name =df_name.values.tolist()

【讨论】:

以上是关于如何将数据框变成一系列列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个数据框变成一个简单的特征数据框?

如何基于VB中文本框的内容播放一系列音频文件?

pandas:如何将字典转换为转置数据框? [复制]

如何根据正则表达式从 pd 系列或数据框中删除行?

如何将列表项附加到数据框中的特定列?

如何将函数应用于增加数据框中的数据子集