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
для каждого столбца.
Вы можете использовать метод .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
Это происходит потому, что ваши 1
и 2
на самом деле "1"
и "2"
. Таким образом, панды просто указывают, что у вас есть столбцы строк, потому что, ну, это строки. Они являются строками, потому что панды предполагали, что 1Â
- строка, а когда вы 1Â
Â
, вы 1Â
с 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
types
без жесткого кодирования, так как есть сотни столбцов. @RafaelC любая помощь?