我有一个包含 30 列的数据框。当我使用 pd.read_csv()
方法加载数据时,所有列的数据类型默认设置为 object
。
我想将 col-1
和 col-5
更改为 int
并将其余列更改为 category
.
我的问题是,如何立即将剩余的列设置为类别
,
我知道我可以做一些像下面这样麻烦的事情
+------------------------------------------------+
| df['col-1'] = df['col-1'].astype('int) |
+------------------------------------------------+
| df['col-2'] = df['col-2'].astype('category') |
| ... |
| df['col-5'] = df['col-5'].astype('int') |
+------------------------------------------------+
| ... |
| df['col-29'] = df['col-29'].astype('category') |
+------------------------------------------------+
| df['col-30'] = df['col-30'].astype('category') |
+------------------------------------------------+
有什么方法可以在读取 csv 时执行如下操作
pd.read_csv('myfile.csv', dtype={('col-1','col-5') : int, 'rest' : 类别})
?
这可能吗?
最佳答案
初始化一个字典,将列名映射到所需的类型,然后将字典传递给 DataFrame.astype
:
dtypes = {c: 'category' for c in df}
dtypes.update({c: 'int' for c in ('col1', 'col5')}
out = df.astype(dtypes)
请注意,您仍然需要显式枚举每一列 - 目前没有任何范围可以将连续切片指定为 astype
。
或者,你也可以这样做
int64_cols = ['col1', 'col5']
df.loc[:, df.columns.difference(int64_cols)] = (
df[df.columns.difference(int64_cols)].astype('category'))
df.loc[int64_cols] = df.loc[int64_cols].astype(int)
这是对 astype
的两次调用,而不是一次。
关于python - 在 python/pandas 中一次更改多列的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56486165/