如何将数据框转换为一系列列表?
How do I turn a dataframe into a series of lists?
我不得不这样做好几次,但我总是很沮丧。我有一个数据框:
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
convenient/effective 方法是什么?
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。
您可以先通过 values
将 DataFrame
转换为 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
数据框到列表的转换
List_name =df_name.values.tolist()
我不得不这样做好几次,但我总是很沮丧。我有一个数据框:
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
convenient/effective 方法是什么?
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。
您可以先通过 values
将 DataFrame
转换为 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
数据框到列表的转换
List_name =df_name.values.tolist()