python - 在 python/pandas 中一次更改多列的数据类型

标签 python pandas

我有一个包含 30 列的数据框。当我使用 pd.read_csv() 方法加载数据时,所有列的数据类型默认设置为 object

我想将 col-1col-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/

相关文章:

python - Matplotlib:是否可以在不创建子图的情况下创建具有给定 y 偏移量的新 Axis ?

python - 有或没有广播的 Pandas 数据帧乘法

python - Scikit Learn - 组合 TfidfVectorizer 和 OneHotEncoder 的输出 - 维度

python - 在 scikit-learn 和/或 pandas 中重新采样

python - Pyside Signal and Slots 连接新方法

python - 使用 LDA(主题模型): the distrubution of each topic over words are similar and "flat"

python - 如何关闭tempfile.mkstemp的句柄?

python - 使用 groupby 获取组中具有最大值的行

Pandas :如何检查 Pandas 数据框是否包含特定值?

python - 按重复状态划分的 Pandas 组