将数据框架中的每一行转换为列表。

4

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

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

我希望将列 B 中的每一行转换为列表。例如,我的期望输出类似于以下内容:
   df_new
   A  B
0  1  [aa]
1  2  [b]
2  3  [c]

1
df['B'].apply(lambda i: [i])的意思是什么? - FObersteiner
3个回答

8

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

df['B'] = df['B'].map(lambda i: [i])

更快速的方法是使用列表推导式:
df['B'] = [[i] for i in df['B']]

性能:

df = pd.DataFrame({'A': ['1', '2', '3'], 'B': ['as', 'b', 'c']})

#30k rows
df = pd.concat([df] * 10000, ignore_index=True)


In [93]: %timeit df['B'].apply(lambda x: x.split(','))
11.1 ms ± 963 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [94]: %timeit df['B'].str.split()
13.1 ms ± 788 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [96]: %timeit df['B'].map(lambda i: [i])
7.15 ms ± 54.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [97]: %timeit df['B'].apply(lambda i: [i])
7.21 ms ± 48.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [98]: %timeit df['B'].str.split(',')
13.9 ms ± 1.46 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [99]: %timeit [[i] for i in df['B']]
5.84 ms ± 73.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

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)

2
你也可以不用 apply,只需要使用 df['B'] = df['B'].str.split() 就可以了吧? - sophocles
是的,你也可以。 - user6223604
1
我认为那将是最好的答案。 - sophocles
@sophocles - 你为什么这样认为? - jezrael
1
出于性能考虑,如果可以在不使用apply的情况下获得相同的结果,那么不使用apply会更好吧? - sophocles
1
@sophocles - 嗯,我误解了 df['B'].apply(lambda x: x.split(',')) 在这里的最佳使用方式。但是完全同意 df['B'] = df['B'].str.split() 是更好的解决方案。它稍微慢一些,但如果有 NaN 或数字不失败,就像 df['B'].apply(lambda x: x.split(',')) 那样。 - jezrael

2
您可以使用apply
df['B'] = df['B'].apply(list)

   A    B
0  1  [a]
1  2  [b]
2  3  [c]

如果其中一行是“as”之类的内容,它就会出错。 - Mohammadreza Riahi
请问您能否添加一个示例呢? - sophocles
a 改为 as,得到列表 ['a', 's'] - jezrael
好的,明白了。如果上面的示例数据包括那个,就更好了。 - sophocles
@sophocles - 嗯,你的解决方案只适用于一个字母,所以不能提高性能。 - jezrael

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