2016-07-21 4 views
2

두 개의 데이터 프레임을 Python2에서 여러 유형의 문자열로 연결할 때 문제가 있습니다. 하나는 정상적인 Py2 문자열을 가지고 있고, 다른 하나는 유니 코드 문자열입니다. 연결은 작동하지만 numpy 배열 내부의 형식은 내부적으로 동일하게 유지됩니다 (설계 상으로는 확실합니다).유니 코드로 DataFrame에 DataFrame을 연결하고 데이터 형식을 표준화하는 방법

import pandas as pd 
from pandas import DataFrame, MultiIndex 
from datetime import datetime as dt 

df = DataFrame(data={'data': ['A', 'BBB', 'CC']}, 
        index=MultiIndex.from_tuples([(dt(2016, 1, 1), 2), 
                (dt(2016, 1, 1), 3), 
                (dt(2016, 1, 2), 2)], 
               names=['date', 'id'])) 

df2 = DataFrame(data={'data': [u'AAAAAAA']}, 
        index=MultiIndex.from_tuples([(dt(2016, 1, 2), 4)], 
                names=['date', 'id'])) 

df3 = pd.concat([df, df2]) 

출력 : 당신이 배열은 지금 '혼합'되어 볼 수 있듯이

>>> df.data.values 
array(['A', 'BBB', 'CC'], dtype=object) 

>>> df2.data.values 
array([u'AAAAAAA'], dtype=object) 

>>> df3.data.values 
array(['A', 'BBB', 'CC', u'AAAAAAA'], dtype=object) 

, 그것은 문자열과 유니 코드가 있습니다. 하나 또는 다른 유형으로 강제 변환 할 수있는 방법이 있습니까? 그렇지 않다면 한면이 유니 코드인지 아닌지를 확인하고 해당 열을 str 또는 유니 코드로 변환하는 쉬운 방법이 있습니까?

(pd.lib.infer_dtype은이 numpy 배열의 dtype을 "mixed"로 표시하므로 신경 쓰지 만 다른 객체와 구별하기 위해 'string'또는 'unicode'로 표시해야합니다. Pandas/Numpy Arrays에 저장 됨)

답변

1

사용 applymapencode

df3.applymap(lambda s: s.encode('utf8')) 

enter image description here

df3.applymap(lambda s: s.encode('utf8')).data.values 

array(['A', 'BBB', 'CC', 'AAAAAAA'], dtype=object) 
3

팬 스타는 astype 메소드를 가지고 있지만 시리즈를 반환합니다. 이것은 효과가있다.

df2_copy = pd.DataFrame(d2.data.astype(str)) 

    df2_copy.data.values 
    array(['AAAAAAA'], dtype=object) 
+0

위시 난 둘 다 답변을 받아 들일 수있다! 둘 다 작동하지만 특정 유스 케이스에 대해서는 다른 대답이 더 좋습니다. 감사! – Bryant

관련 문제