假设我们在Python中有这个数组:
import pandas as pd
arr = pd.DataFrame(['aabbc','aabccca','aa'])
我想将每一行拆分为其角色的列。行的长度可能不同。 它是我期望的输出(在这种情况下为3 * 7矩阵):
1 2 3 4 5 6 7
1 a a b b c Na Na
2 a a b c c c a
3 a a Na Na Na Na Na
我的矩阵的行数是20000,我不想使用for loops
。原始数据是蛋白质序列。
我看了[1],[2],[3]等,但他们没有帮助我。
答案 0 :(得分:3)
选项1
一种简单的方法是使用列表推导。
pd.DataFrame([list(x) for x in arr[0]])
0 1 2 3 4 5 6
0 a a b b c None None
1 a a b c c c a
2 a a None None None None None
或者,使用apply(list)
做同样的事情。
pd.DataFrame(arr[0].apply(list).tolist())
0 1 2 3 4 5 6
0 a a b b c None None
1 a a b c c c a
2 a a None None None None None
选项2
替代extractall
+ unstack
。您最终会得到一个多列索引。您可以删除结果的第一级。
v = arr[0].str.extractall(r'(\w)').unstack()
v.columns = v.columns.droplevel(0)
v
match 0 1 2 3 4 5 6
0 a a b b c None None
1 a a b c c c a
2 a a None None None None None
选项3
操纵view
-
v = arr[0].values.astype(str)
pd.DataFrame(v.view('U1').reshape(v.shape[0], -1))
0 1 2 3 4 5 6
0 a a b b c
1 a a b c c c a
2 a a
这会在单元格中为您提供空字符串(''
)而不是None
s。如果要将其添加回来,请使用replace
。