Python Pandas - 将字符串拆分为列(系列到数据帧)

时间:2016-03-09 17:24:29

标签: python pandas

我有一个简单的问题。这里是: 我有一个熊猫系列的字符串:

In [54]: import pandas as pd

In [55]: pd.Series(["01234", "asdfg"])
Out[55]: 
0    01234
1    asdfg
dtype: object

我需要的是一个数据框,其中包含每个字符串位置的列。所有字符串都有相同的长度。

Out[55]:
    0   1   2   3   4
0   '0' '1' '2' '3' '4'
1   'a' 's' 'd' 'f' 'g'
你能帮帮我吗? 我尝试过各种各样的字符串操作......

3 个答案:

答案 0 :(得分:0)

如果您已经构建了系列s

df = s.apply(lambda x: pd.Series(list(x)))

如果您从原始数据开始,直接转到DataFrame可能会更容易:

data = ["01234", "asdfg"]
df = pd.DataFrame([list(x) for x in data])

答案 1 :(得分:0)

如果你有一个字符串dtype的NumPy数组:

In [22]: arr
Out[22]: 
array(['01234', 'asdfg'], 
      dtype='|S5')

然后您可以将其视为dtype 'S1'的数组,将每个字符串拆分为1个字节的字符:

In [23]: arr.view('S1')
Out[23]: 
array(['0', '1', '2', '3', '4', 'a', 's', 'd', 'f', 'g'], 
      dtype='|S1')

然后重塑它以获得所需的形式:

In [24]: arr.view('S1').reshape(2, -1)
Out[24]: 
array([['0', '1', '2', '3', '4'],
       ['a', 's', 'd', 'f', 'g']], 
      dtype='|S1')

因此,

import pandas as pd

s = pd.Series(["01234", "asdfg"])
n = len(s[0])

df = pd.DataFrame(s.values
                  .astype('S{}'.format(n))
                  .view('S1')
                  .reshape(len(s), -1))

print(df)

产量

   0  1  2  3  4
0  0  1  2  3  4
1  a  s  d  f  g

答案 2 :(得分:0)

假设“所有字符串长度相等”,我会使用pandas.Series.str.extract()函数:

from __future__ import print_function

import pandas as pd

s = pd.Series(["01234", "asdfg"])
print('Original series:\n', s)

re_pat = ''.join(['(?P<col{0}>.)'.format(i) for i in range(1, len(s[0]) +1)])
print('\nRegEx for s.str.extract():\t{0}'.format(re_pat))

df = s.str.extract(re_pat)
print('\nresulting DF:\n', df)

输出:

Original series:
 0    01234
1    asdfg
dtype: object

RegEx for s.str.extract():
 (?P<col1>.)(?P<col2>.)(?P<col3>.)(?P<col4>.)(?P<col5>.)

resulting DF:
   col1 col2 col3 col4 col5
0    0    1    2    3    4
1    a    s    d    f    g

PS当然,您不必明确命名列:

re_pat = '(.)' * len(s[0])
print('\nRegEx for s.str.extract():\t{0}'.format(re_pat))

df = s.str.extract(re_pat)
print('\nresulting DF:\n', df)

输出:

resulting DF:
   0  1  2  3  4
0  0  1  2  3  4
1  a  s  d  f  g
相关问题