2016-09-06 5 views
1

저는 Pandas를 처음 사용했습니다. 데이터 세트를 처리합니다. 열 중 하나가 파이프 (|) 값으로 구분 된 문자열입니다. 이제 특정 기준을 충족시키지 않는 분리 된 필드에서 텍스트를 제거하는 작업이 있습니다.pandas 데이터 프레임에 dtype 목록을 포함 할 수 있습니까?

나의 순진한 접근 방식은 데이터 프레임을 행 단위로 반복하고 필드를 목록으로 분해 한 다음이 방법으로 유효성을 검사하는 것입니다. 그런 다음 수정 된 행을 원래 데이터 프레임에 다시 쓰십시오. 이 메타 샘플보기 :

for index, row in dataframe.iterrows(): 
    fixed = [x[:29] for x in row['field'].split('|')] 
    dataframe.loc[index, 'field'] = "|".join(fixed) 

이렇게하는 것이 더 중요하고 빠른 방법이 있습니까?

+0

이것은 단지 데이터 구조의 오용처럼 날 것으로 보인다. 구분 기호로 구분 된 필드 목록 인 열을 사용하는 이유는 무엇입니까? 다른 컬럼은 무엇입니까? –

+0

해당 열 또는 데이터 프레임의 예를 제공 할 수 있습니까? –

+0

@ juanpa.arrivillaga 그게 데이터가 CSV에서 나에게 오는 방식입니다. 다른 열도 있지만 목록과 같은 구조를 가진 유일한 열입니다. 요점은 나에게 오는 원래 데이터에서 때로는 그 값 중 하나가 잘못되었다는 것입니다. 그리고 데이터 셋을 더 사용하기 전에 필터를 제거해야합니다. –

답변

2

IIUC 당신은 사용할 수 있습니다

dataframe = pd.DataFrame({'field':['aasd|bbuu|cccc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'], 
          'G':[4,5,6]}) 

print (dataframe) 
    G     field 
0 4 aasd|bbuu|cccc|ddde|e 
1 5  ffff|gggg|hhhh|i|j 
2 6    cccc|u|k 


print (dataframe.field.str.split('|', expand=True) 
          .stack() 
          .str[:2] #change to 29 
          .groupby(level=0) 
          .apply('|'.join)) 

0 aa|bb|cc|dd|e 
1  ff|gg|hh|i|j 
2   cc|u|k 
dtype: object 

또 다른 해결책을 지능형리스트를 통해 :

dataframe['new'] = pd.Series([[x[:2] for x in y] for y in dataframe.field.str.split('|')], 
          index=dataframe.index) 
        .apply('|'.join) 
print (dataframe) 
    G     field   new 
0 4 aasd|bbuu|cccc|ddde|e aa|bb|cc|dd|e 
1 5  ffff|gggg|hhhh|i|j ff|gg|hh|i|j 
2 6    cccc|u|k   cc|u|k 

dataframe = pd.DataFrame({'field':['aasd|bbuu|cc|ddde|e','ffff|gggg|hhhh|i|j','cccc|u|k'], 
        'G':[4,5,6]}) 

print (dataframe) 
    G    field 
0 4 aasd|bbuu|cc|ddde|e 
1 5 ffff|gggg|hhhh|i|j 
2 6    cccc|u|k 

만약 필요 필터 이상 2 같은 값으로 모든 값 :

s = dataframe.field.str.split('|', expand=True).stack() 
print (s) 
0 0 aasd 
    1 bbuu 
    2  cc 
    3 ddde 
    4  e 
1 0 ffff 
    1 gggg 
    2 hhhh 
    3  i 
    4  j 
2 0 cccc 
    1  u 
    2  k 
dtype: object 

dataframe['new'] = s[s.str.len() < 3].groupby(level=0).apply('|'.join) 
print (dataframe) 

    G    field new 
0 4 aasd|bbuu|cc|ddde|e cc|e 
1 5 ffff|gggg|hhhh|i|j i|j 
2 6    cccc|u|k u|k 
,451,515,

또 다른 해결책은 : 언뜻보기에

dataframe['new'] = pd.Series([[x for x in y if len(x) < 3] for y in dataframe.field.str.split('|')], 
           index=dataframe.index) 
        .apply('|'.join) 
print (dataframe) 
    G    field new 
0 4 aasd|bbuu|cc|ddde|e cc|e 
1 5 ffff|gggg|hhhh|i|j i|j 
2 6    cccc|u|k u|k 
+0

감사합니다. 매우 포괄적 인 작품입니다. –

관련 문제