Преобразовать тип данных из нескольких столбцов с помощью цикла for - PullRequest
2 голосов
/ 14 марта 2020

У меня есть 21840x39 фрейм данных. Некоторые из моих столбцов имеют числовое значение, и я хочу убедиться, что они все в одном и том же data type (которым я хочу быть float).

Вместо того, чтобы называть все столбцы и преобразовывать их их:

df[['A', 'B', 'C', '...]] = df[['A', 'B', 'C', '...]].astype(float)

Могу ли я сделать for loop, который позволит мне сказать что-то вроде «преобразовать в число с плавающей точкой из столбца 18 в столбец 35»

Я знаю, как сделать один столбец : df['A'] = df['A'].astype(float)

Но как мне сделать несколько столбцов? Я попытался срезать список в пределах al oop, но не смог сделать это правильно.

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Первая идея - преобразовать выбранные столбцы, python считает от 0, поэтому для 18 to 36 столбцов используйте:

df.iloc[:, 17:35] = df.iloc[:, 17:35].astype(float)

Если не работает (из-за возможной ошибки), используйте другое решение:

df = df.astype(dict.fromkeys(df.columns[17:35], float))

Образец - преобразовать 8-15 столбцы:

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(10, size=(3, 18)),
                  columns=list('abcdefghijklmnopqr')).astype(str)
print (df)
   a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r
0  0  8  3  6  3  3  7  8  0  0  8  9  3  7  2  3  6  5
1  0  4  8  6  4  1  1  5  9  5  6  6  6  5  4  6  4  2
2  3  4  7  1  4  9  3  2  0  9  1  2  7  1  0  2  8  8

df = df.astype(dict.fromkeys(df.columns[7:15], float))
print (df)
   a  b  c  d  e  f  g    h    i    j    k    l    m    n    o  p  q  r
0  0  8  3  6  3  3  7  8.0  0.0  0.0  8.0  9.0  3.0  7.0  2.0  3  6  5
1  0  4  8  6  4  1  1  5.0  9.0  5.0  6.0  6.0  6.0  5.0  4.0  6  4  2
2  3  4  7  1  4  9  3  2.0  0.0  9.0  1.0  2.0  7.0  1.0  0.0  2  8  8
1 голос
/ 14 марта 2020

Подправлен код @jezrael, так как ввод в названия столбцов (я чувствую) является хорошим вариантом.

import pandas as pd
import numpy as np

np.random.seed(2020)
df = pd.DataFrame(np.random.randint(10, size=(3, 18)),
                  columns=list('abcdefghijklmnopqr')).astype(str)

print(df)

columns = list(df.columns)

#change the first and last column names below as required
df = df.astype(dict.fromkeys(
    df.columns[columns.index('h'):(columns.index('o')+1)], float))

print (df)

Оставив здесь оригинальный ответ ниже, но обратите внимание: Никогда l oop в pandas если существуют векторизованные альтернативы

Если бы у меня был кадр данных и я хотел изменить столбцы 'col3' на 'col5' (читаемые человеком имена) на числа с плавающей точкой, я мог бы ...

import pandas as pd
import re

df = pd.read_csv('dummy_data.csv')

df

enter image description here

columns = list(df.columns)

#change the first and last column names below as required
start_column = columns.index('col3')
end_column   = columns.index('col5')

for index, col in enumerate(columns):
    if (start_column <= index) & (index <= end_column):
        df[col] = df[col].astype(float)
df

enter image description here

... просто путем изменения имен столбцов. Возможно, легче работать с именами столбцов и «от этого» и «до этого» (включительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...