[英]Python Pandas - Splitting strings to columns (series to dataframe)
我有一個簡單的問題。 它是:我有一系列的熊貓字符串:
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'
你能幫我么? 我已經嘗試過各種字符串操作...
如果你已經有了一個系列s
構成:
df = s.apply(lambda x: pd.Series(list(x)))
如果您是從原始數據開始的,那么直接轉到DataFrame可能會更容易:
data = ["01234", "asdfg"]
df = pd.DataFrame([list(x) for x in data])
如果您有一個NumPy字符串dtype數組:
In [22]: arr
Out[22]:
array(['01234', 'asdfg'],
dtype='|S5')
那么您可以將其視為dtype'S1 '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
假設“所有字符串的長度相等”,我將使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.