在python/pandas中同时更改多个列的数据类型

在python/pandas中同时更改多个列的数据类型,python,pandas,Python,Pandas,我有一个30列的数据框。当我使用pd.read_csv方法加载数据时,默认情况下,所有列的数据类型都设置为object 我想将第1列和第5列更改为int,其余列更改为category 我的问题是,如何将剩余的列一次设置为category 我知道我可以做一些像下面这样麻烦的事情 +------------------------------------------------+ | df['col-1'] = df['col-1'].astype('int) |

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

我想将第1列和第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}


这是否可行???

初始化将列名映射到所需类型的词典,然后将词典传递给:

请注意,您仍然需要显式枚举每一列—目前没有任何范围可用于将连续切片指定给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的两次调用,而不是一次调用。

初始化将列名映射到所需类型的字典,然后将字典传递给:

请注意,您仍然需要显式枚举每一列—目前没有任何范围可用于将连续切片指定给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的两个调用,而不是一个。

另一种方法是在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')

另一种方法是在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')

非常感谢,非常感谢您抽出时间。因为我是python/pandas的初学者,所以我很容易理解@Erfan答案,并且能够将其调整到其他情况。所以我接受了他的回答。毫无疑问,你的回答看起来更专业。“我希望我能仔细分析你的答案,得到一些事先的建议。”汤米我不明白。你所能做的是投票支持我们的两个答案,即使你只能接受一个。我现在可以了。就在刚才,我不能。因为我只有不到15个名声…非常感谢你,非常感谢你抽出时间。因为我是python/pandas的初学者,所以我很容易理解@Erfan答案,并且能够将其调整到其他情况。因此,我接受了他的回答。毫无疑问,你的回答看起来更专业。“我希望我能仔细分析你的答案,得到一些事先的建议。”汤米我不明白。你所能做的是投票支持我们的两个答案,即使你只能接受一个。我现在可以了。就在刚才,我不能。因为我只有不到15个名声。。