我有一个pandas系列,其中包含每个元素的数组,如下所示:
0 [0, 0]
1 [12, 15]
2 [43, 45]
3 [9, 10]
4 [0, 0]
5 [3, 3]
6 [0, 0]
7 [0, 0]
8 [0, 0]
9 [3, 3]
10 [2, 2]
我想提取所有第一个元素,将它们放在另一个系列或列表中,并对第二个元素执行相同的操作。 我试过做正则表达式:
mySeries.str.extract(r'\[(\d+), (\d+)\]', expand=True)
并分裂:
mySeries.str.split(', ').tolist())
都提供nan
值。我做错了什么?
答案 0 :(得分:3)
案例1
列表列
您需要.tolist
该列并将其加载到DataFrame中。
pd.DataFrame(df['col'].tolist())
df
col
0 [0, 0]
1 [12, 15]
2 [43, 15]
3 [9, 10]
4 [0, 0]
5 [3, 3]
6 [0, 0]
7 [0, 0]
8 [0, 0]
9 [3, 3]
10 [2, 2]
pd.DataFrame(df['col'].tolist())
0 1
0 0 0
1 12 15
2 43 15
3 9 10
4 0 0
5 3 3
6 0 0
7 0 0
8 0 0
9 3 3
10 2 2
注意:如果您的数据有NaN,我建议先删除它们:df = df.dropna()
然后按上图所示继续操作。
案例2
字符串列表示为列表
如果你有< 100行,使用:
df['col'] = pd.eval(df['col'])
然后实现案例1.否则,使用ast
:
import ast
df['col'] = df['col'].apply(ast.literal_eval)
继续像往常一样。
答案 1 :(得分:2)
一种解决方案是将pd.DataFrame.apply
与pd.Series
一起使用。这假设您有一系列列表,如您的问题所暗示的,而不是字符串。
您的逻辑不适用于一系列列表,因为这些列表未在pandas
中表示为字符串。
df = pd.DataFrame({'A': [[1, 2], [3, 4], [5, 6]]})
df[['B', 'C']] = df['A'].apply(pd.Series)
print(df)
A B C
0 [1, 2] 1 2
1 [3, 4] 3 4
2 [5, 6] 5 6
答案 2 :(得分:1)
zip
df.col
df.assign(**dict(zip('AB', zip(*df.col))))
col A B
0 [0, 0] 0 0
1 [12, 15] 12 15
2 [43, 45] 43 45
3 [9, 10] 9 10
4 [0, 0] 0 0
5 [3, 3] 3 3
6 [0, 0] 0 0
7 [0, 0] 0 0
8 [0, 0] 0 0
9 [3, 3] 3 3
10 [2, 2] 2 2
或者
df['A'], df['B'] = zip(*df.col)
df
col A B
0 [0, 0] 0 0
1 [12, 15] 12 15
2 [43, 45] 43 45
3 [9, 10] 9 10
4 [0, 0] 0 0
5 [3, 3] 3 3
6 [0, 0] 0 0
7 [0, 0] 0 0
8 [0, 0] 0 0
9 [3, 3] 3 3
10 [2, 2] 2 2