Измените dtype для dataframe автоматически после применения некоторых операций

1
txt = '''A B C 
1Â 2Â abcÂ
2Â 5Â defÂ'''

df = pd.read_table(StringIO(txt), sep = '\s{1,}')

Итак, это dataframe:

    A   B   C
0   1Â  2Â  abcÂ
1   2Â  5Â  defÂ

теперь df.dtypes дает:

A    object
B    object
C    object
dtype: object

После удаления специального символа Â.

df = df.applymap(lambda x: x.strip('Â'))

Я хочу соответствующим образом изменить dtypes данных каждого столбца.

Я использовал df.infer_dtype().dtypes но он все еще дает object dtype. Я также использовал pd.api.types.infer_dtype(df) но он дает string, но я хочу dtypes для каждого столбца.

Теги:
pandas

2 ответа

1

Вы можете использовать метод .astype() для изменения dtypes. Используйте dict для таргетинга определенных столбцов и их предполагаемых типов.

import numpy as np

# Create data frame and clean data...

types = {'A': np.int64, 'B': np.int64, 'C': np.str}
df = df.astype(types)

df.dtypes

A     int64
B     int64
C    object
dtype: object

EDIT: Если я правильно вас понимаю, вы хотите, чтобы dtypes кадра данных после его очистки. В этом случае вы можете сделать следующее:

# Implicitly convert numeric types; see the 'convert_objects'
# documentation for other supported types
df = df.convert_objects(convert_numeric=True)

df.apply(pd.api.types.infer_dtype)

A    integer
B    integer
C     string
dtype: object

Или, для дикта:

dict(df.apply(pd.api.types.infer_dtype))

{'A': 'integer', 'B': 'integer', 'C': 'string'}

Примечание. Я использую pandas 0.23.3.

EDIT 2: По вашему запросу здесь приведен полный код, который я использую. Я также упростил его, так что никаких выводов не требуется.

from io import StringIO
txt = '''A B C 
1Â 2Â abcÂ
2Â 5Â defÂ'''

df = pd.read_table(StringIO(txt), sep = '\s{1,}', engine='python')
df = df.applymap(lambda x: x.strip('Â'))

df = df.convert_objects(convert_numeric=True)

df.dtypes

A     int64
B     int64
C    object
dtype: object
  • 0
    Хотя это работает, я считаю, что OP хочет точно НЕ устанавливать типы вручную.
  • 0
    Я просто хочу получить словарь types без жесткого кодирования, так как есть сотни столбцов. @RafaelC любая помощь?
Показать ещё 8 комментариев
0

Это происходит потому, что ваши 1 и 2 на самом деле "1" и "2". Таким образом, панды просто указывают, что у вас есть столбцы строк, потому что, ну, это строки. Они являются строками, потому что панды предполагали, что - строка, а когда вы Â, вы с str "1"

Вместо этого вы можете вручную проанализировать свои данные и просто создать фрейм данных с очищенными данными.

Например

def clean(txt):
    return txt.read().replace('Â', '')

Сейчас

pd.read_table(StringIO(clean(txt)), delim_whitespace=True).dtypes

доходность

A     int64
B     int64
C    object
dtype: object
  • 0
    Это работает в этом случае. Но я хочу изменить тип после прочтения кадра данных и очистки в общем случае. Есть ли способ сделать это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню