将数据帧的每一行转换为列表

Moh*_*ahi 4 python dataframe pandas

我有一个像这样的数据框:

df = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['aa', 'b', 'c']})
   A  B
0  1  aa
1  2  b
2  3  c
Run Code Online (Sandbox Code Playgroud)

我想将每一行列转换B为一个列表。例如,我想要的输出是这样的:

   df_new
   A  B
0  1  [aa]
1  2  [b]
2  3  [c]
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 8

我认为评论的解决方案非常快:

\n
df['B'] = df['B'].map(lambda i: [i])\n
Run Code Online (Sandbox Code Playgroud)\n

使用列表理解更快:

\n
df['B'] = [[i] for i in df['B']]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

表现

\n
df = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['as', 'b', 'c']})\n\n#30k rows\ndf = pd.concat([df] * 10000, ignore_index=True)\n\n\nIn [93]: %timeit df['B'].apply(lambda x: x.split(','))\n11.1 ms \xc2\xb1 963 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [94]: %timeit df['B'].str.split()\n13.1 ms \xc2\xb1 788 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\n\nIn [96]: %timeit df['B'].map(lambda i: [i])\n7.15 ms \xc2\xb1 54.8 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [97]: %timeit df['B'].apply(lambda i: [i])\n7.21 ms \xc2\xb1 48.9 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\nIn [98]: %timeit df['B'].str.split(',')\n13.9 ms \xc2\xb1 1.46 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n\n\nIn [99]: %timeit [[i] for i in df['B']]\n5.84 ms \xc2\xb1 73.3 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n


小智 6

您可以使用split来做事情。

import pandas as pd
df = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['a', 'b', 'c']})
df['B'] = df['B'].apply(lambda x: x.split(','))
print(df)
Run Code Online (Sandbox Code Playgroud)

  • 你也可以不使用“apply”来做到这一点,对吧?只是 ```df['B'] = df['B'].str.split()``` ? (2认同)