2014-11-23 2 views
3

팬더 시리즈에서 중첩 된 키 - 값 쌍이 있습니다. 열을 개별 열로 분할하는 가장 효율적인 방법은 무엇입니까? (I는 압축을 풀고 변환을 수행하지만, 최고의 방법은 무엇 수 있습니까?)키 - 값 쌍을 DataFrame 열로 파싱

을 내가 하지 알고있다 :

  • 키 이름 사전
  • 각 레코드의 키
  • 각 레코드의 키 순서

행은 다음과 같습니다. 유니 코드 문자열의 목록. 일단 추출되면 값은 항상 bigint가됩니다.

입력 :

parsedSeries.head() 

0 [key1=774, key2=238] 
1 [key1=524, key2=101, key3=848] 
2 [key3=843] 
3 [key1=232, key3=298, key2=457] 

예상 출력 : 입력 X가로서의 위해 필요한 규칙을 준수하는 것으로 가정된다 포맷 u"X=Y"의 유니 코드 문자열을 포함하는리스트 이루어지는 것을

record key1 key2 key3 
0  774 238 NAN 
1  524 101 848 
2  NAN NAN 843 
3  232 457 298 

참고 Python의 속성 이름 및 Y은 항상 정수로 해석 될 수 있습니다. 예를 들어, 위의 샘플 데이터를 구성하는 데 다음을 사용할 수 있습니다.

pandas.Series([[u"key1=774", u"key2=238"], 
       [u"key1=524", u"key2=101", u"key3=848"], 
       [u"key3=843"], 
       [u"key1=232", u"key3=298", u"key2=457"]]) 
+0

'parsedSeries.ix [0]'의 종류는 무엇입니까? 당신의 예제는'[key1 = 774, key2 = 238] '이라는 것을 보여줍니다, 그러나 이것은 무엇입니까? 그것은 목록이 될 수 없다, 그것은 'dict'인가? 각 항목이 '사전'인 시리즈가 있습니까? 또는 2-tuples 시퀀스로 구성되어 있습니까? 아니면 무엇입니까? – ely

+0

그것은 목록입니다 ... [81]에서 : type (parsedSeries.ix [0]) Out [81] : list. df에 str.split을 적용하여 목록을 만듭니다. – Peter

+0

그러면 'type (parsedSeries.ix [0] [0])'은 무엇입니까? – ely

답변

2

"최상의"해결책은 처음에는이 상황에서 스스로를 찾지 않는 것입니다. 대부분의 경우 Vector 또는 DataFrame에 비 스칼라 수량이있는 경우 이미 벡터 연산을 적용 할 수 없기 때문에 이미 잘못된 방향으로 나아갔습니다.어떤 경우

, 당신의 시리즈에서 시작, 당신이 뭔가를 할 수 있습니다 :

>>> ds = [dict(w.split('=', 1) for w in x) for x in s] 
>>> pd.DataFrame.from_records(ds) 
    key1 key2 key3 
0 774 238 NaN 
1 524 101 848 
2 NaN NaN 843 
3 232 457 298 
1

ok 최종 결과는 예제의 정확도에 따라 다를 수 있습니다. 특히 데이터를 파싱하는 정규식을 조정할 수 있습니다.

import re 
import pandas as pd 
from StringIO import StringIO 

f = StringIO("""0 [key1=774, key2=238] 
1 [key1=524, key2=101, key3=848] 
2 [key3=843] 
3 [key1=232, key3=298, key2=457]""") 

이제 우리는 시작할 준비가 :

어떤 imoprts을하고 데이터 파일을 설정할 수 있습니다. 우선 그냥 정규식 마법이 행의 DICT 표현을 얻을 수 있습니다 :

# get the dicts 
rows = [dict(re.findall('(key[0-9]*)=([0-9]*)',l)) for l in f] 
# convert values to ints 
rows = [dict((k,int(v)) for k,v in row.items()) for row in rows] 
rows 

출력 :

[{'key1': 774, 'key2': 238}, 
{'key1': 524, 'key2': 101, 'key3': 848}, 
{'key3': 843}, 
{'key1': 232, 'key2': 457, 'key3': 298}] 
단지 정규식했다

하지만 당신은 단지에 대한이 있습니다 :

pd.DataFrame(rows) 

출력 :

key1 key2 key3 
0 774 238 NaN 
1 524 101 848 
2 NaN NaN 843 
3 232 457 298 

Conver 당신이 원한다면 한 줄짜리지만, 두 단계로 남겨두면 실제 데이터 파일에 맞게 정규 표현식을 조정할 수 있습니다.

1

정수가 아닌 문자열로 값을 처리를 위해서 from_records의 DSM의 사용에 아주 약간의 비틀기.

def key_to_int(split_vals): 
    return (split_vals[0], int(split_vals[1])) 

def dictify(row): 
    return dict(key_to_int(elem.split("=")) for elem in row) 

pandas.DataFrame.from_records(parsedSeries.map(dictify)) 

는 정수 값 (열 여전히 floatNaN 값에 의한 입력과 정수의 NaN 값 지원 NumPy와의 지속적인 부족하다)이다

Out[518]: 
    key1 key2 key3 
0 774 238 NaN 
1 524 101 848 
2 NaN NaN 843 
3 232 457 298 

[4 rows x 3 columns] 

을 준다.

관련 문제