Как я могу изменить типы данных нескольких столбцов данных на основе условия в python? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть фрейм данных с 80 столбцами, для некоторых столбцов типы данных должны быть целыми числами, но python видит их как float. Вместо того, чтобы вручную изменять типы данных, я пытаюсь написать al oop, который идентифицирует тип данных, который содержит столбец, и соответственно изменяет тип данных. Я пробовал следующие параметры, но они не дали никаких результатов:

1) Я пытался взять столбцы как переменную, и, если тип данных является плавающим, преобразовать его в целое число.

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

2) Я также попробовал это

for x in data1.columns:
    if x isinstance(x,float):
        data1=data1.astype(int)
    else:
        break

Мой общий вопрос: возможно ли изменить типы данных столбца с помощью al oop, condition, function et c.?

Перед публикацией вопрос, который я исследовал в Интернете, большинство вопросов об изменении типа данных отдельной колонки.

Спасибо за ваши ответы заранее.

1 Ответ

1 голос
/ 15 апреля 2020

Использование:

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

Идея состоит в том, чтобы фильтровать только цифры c столбцы сначала по DataFrame.select_dtypes, а затем получить все целые и целые столбцы, такие как числа с плавающей запятой (0 после десятичного числа ) путем сравнения преобразованных столбцов в целые числа и фильтрации всех соответствующих столбцов по DataFrame.all, фильтрации их, создания словаря и передачи в DataFrame.astype

df1 = df.select_dtypes(np.number)
d = dict.fromkeys(df1.columns[df1.eq(df1.astype(int)).all()], 'int')

df = df.astype(d)
print (df)
   A  B  C    D  E  F
0  a  4  7  1.8  5  a
1  b  5  8  3.3  3  a
2  c  4  9  5.0  6  a
3  d  5  4  7.0  9  b
4  e  5  2  1.0  2  b
5  f  4  3  0.0  4  b

Подробности :

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'}

Если хотите, установите все столбцы с плавающей точкой целыми числами - ваше решение l oop:

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

Non l oop решение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...