我有一个简单的问题。这里是: 我有一个熊猫系列的字符串:
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'
你能帮帮我吗?
我尝试过各种各样的字符串操作......
答案 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