如何根据python中的条件更改多个dataframe列的数据类型?

如何根据python中的条件更改多个dataframe列的数据类型?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个80列的数据框,对于某些列,数据类型应该是整数,但python将它们视为浮点。我没有手动更改数据类型,而是尝试编写一个循环来标识列包含的数据类型,并相应地更改数据类型。我尝试了以下选项,但没有提供任何结果: 1) 我尝试将列作为变量,如果数据类型为float,则将其转换为整数 对于data1.columns中的x,: 如果isinstance(数据1.列,浮点): data1[x]=data1[x].aType('int') 2) 我也试过这个 对于data1.columns中的x,:

我有一个80列的数据框,对于某些列,数据类型应该是整数,但python将它们视为浮点。我没有手动更改数据类型,而是尝试编写一个循环来标识列包含的数据类型,并相应地更改数据类型。我尝试了以下选项,但没有提供任何结果:

1) 我尝试将列作为变量,如果数据类型为float,则将其转换为整数

对于data1.columns中的x,
:
如果isinstance(数据1.列,浮点):
data1[x]=data1[x].aType('int')
2) 我也试过这个

对于data1.columns中的x,
:
如果x为持续(x,浮动):
data1=data1.astype(int)
其他:
打破
我的一般问题是,是否可以使用循环、条件、函数等更改列数据类型

在发布一个问题之前,我在网上研究了大多数关于更改单个列的数据类型的问题

提前感谢您的回答。

使用:

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,5.,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1.8,3.3,5,7,1,0],
         'E':[5.0,3,6,9,2,4],
         'F':list('aaabbb')
})
print (df)
   A    B  C    D    E  F
0  a  4.0  7  1.8  5.0  a
1  b  5.0  8  3.3  3.0  a
2  c  4.0  9  5.0  6.0  a
3  d  5.0  4  7.0  9.0  b
4  e  5.0  2  1.0  2.0  b
5  f  4.0  3  0.0  4.0  b
其思想是首先只过滤数字列,然后通过将转换的列与整数进行比较来获取所有整数和整数列(如浮点(
0
在十进制之后),然后过滤所有匹配的列,过滤它们,创建字典并传递给

详细信息

print (df1.eq(df1.astype(int)))
      B     C      D     E
0  True  True  False  True
1  True  True  False  True
2  True  True   True  True
3  True  True   True  True
4  True  True   True  True
5  True  True   True  True

print (df1.columns[df1.eq(df1.astype(int)).all()])
Index(['B', 'C', 'E'], dtype='object')

print (d)
{'B': 'int', 'C': 'int', 'E': 'int'}
如果要将所有浮点列设置为整数-循环解决方案:

for x in data1.columns:
    if isinstance(data1[x].iat[0],float):
        data1[x]=data1[x].astype(int)

print (data1)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b
data1 = data1.astype(dict.fromkeys(data1.select_dtypes(np.floating), 'int'))
print (data1)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b
非循环解决方案:

for x in data1.columns:
    if isinstance(data1[x].iat[0],float):
        data1[x]=data1[x].astype(int)

print (data1)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b
data1 = data1.astype(dict.fromkeys(data1.select_dtypes(np.floating), 'int'))
print (data1)
   A  B  C  D  E  F
0  a  4  7  1  5  a
1  b  5  8  3  3  a
2  c  4  9  5  6  a
3  d  5  4  7  9  b
4  e  5  2  1  2  b
5  f  4  3  0  4  b

当你运行建议的代码时会发生什么?你能为可读性设置代码格式吗?很抱歉,我没有注意到代码被弄乱了,我编辑了它。感谢你的建议,数据是我们进行的一项家庭级调查,目的是测量新冠病毒-19对难民家庭的财务影响。我曾考虑过过滤数字列,但我不希望创建另一个数据帧,更改数据类型,然后在可能创建循环的情况下与原始数据帧合并。@AlperenAıkol-Hmmm,那么您需要循环吗?原因是什么?因为在中国,熊猫真的不被推荐@jezael这不一定是需要的,我试图用循环来解决这个问题,因为我不想为40多个列创建字典,但在阅读了你指出的帖子后,我决定坚持建议的解决方案。很抱歉回复太晚,我检查了代码它解决了我的问题谢谢你,伙计。我只有一个问题,你介绍了iat[0]它到底做什么?@AlperenAıkol-它获取列的第一个值并检查是否浮点