我有一个有30列的数据。使用pd.read_csv()方法加载数据时,默认情况下所有列的数据类型都设置为object。
我想将col-1 & col-5更改为int &其他列为category。
我的问题是,如何立即将其余的列设置为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' : category})
这个是可能的吗??
发布于 2019-06-06 23:20:42
另一种方法是在for循环中使用astype。
cat_cols = [col for col in df.columns if col not in ['col1', 'col5']]
for col in cat_cols:
df[col] = df[col].astype('category')发布于 2019-06-06 23:18:14
初始化将列名映射到所需类型的字典,然后将字典传递给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的两个调用,而不是一个调用。
https://stackoverflow.com/questions/56486165
复制相似问题