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

Python 如何将数据帧转换为一系列列表?,python,list,pandas,dataframe,series,Python,List,Pandas,Dataframe,Series,我已经做了好几次了,我总是很沮丧。我有一个数据帧: 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

我已经做了好几次了,我总是很沮丧。我有一个数据帧:

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

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

# Only works with a non MultiIndex
# and its slow, so don't use it
df.T.apply(tuple).apply(list)
pd.Series(df.T.to_dict('list'))
两者都给你:

a    [1, 2, 3, 4]
b    [5, 6, 7, 8]
dtype: object
但是,选项2的缩放效果更好


时机 给定的
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

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)
的结果是错误的,因为该解决方案不适用于多索引


如果需要更快的解决方案,您可以首先将
数据帧
转换为
numpy数组
,然后转换为列表,最后使用
df
的索引创建新的
系列

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

数据帧到列表的转换

List_name =df_name.values.tolist()