2016-07-21 1 views
2

У меня возникают проблемы при объединении двух фреймов данных с различными типами строк в Python2. У одного есть нормальные строки Py2, а другая - строка юникода. Конкатенация работает, но типы внутри массивов numpy остаются неизменными (по дизайну я уверен).Как объединить DataFrame со строкой в ​​DataFrame с Unicode и нормализовать тип данных

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 или unicode?

(меня волнует, потому что pd.lib.infer_dtype будет отмечать dtype этого массива numpy как «смешанный», и мне нужно, чтобы он был помечен как «строка» или «unicode», чтобы отличать его от других объектов, сохраняются в массивах Pandas/Numpy)

ответ

1

Использование applymap и encode

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

Pandas имеет метод астеризма, но он возвращает серию. Это сработает.

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

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

Жаль, что я мог бы принять оба ответа! Они оба работают, но другой ответ лучше для моего конкретного случая использования. Благодаря! – Bryant