15

Изменение типа столбца в pandas

19

Я создал DataFrame из списка списков:

table = [
    ['a',  '1.2',  '4.2'],
    ['b',  '70',   '0.03'],
    ['x',  '5',    '0']
]

df = pd.DataFrame(table)

Как мне конвертировать столбцы в определенные типы? В данном случае я хочу преобразовать 2-й и 3-й столбцы в тип float.

Существует ли способ указать типы во время преобразования списка в DataFrame? Или лучше создать DataFrame сначала, а затем пройтись по столбцам, чтобы поменять тип для каждого из них? В идеале я хотел бы сделать это динамически, так как может быть сотни столбцов, и не хочу точно указывать, какие столбцы какого типа. Всё, что я могу гарантировать, это то, что в каждом столбце находятся значения одного типа.

5 ответ(ов)

5

Чтобы преобразовать значения в столбцах DataFrame Pandas в тип float, вы можете использовать метод astype(). В вашем случае вы хотите изменить типы данных для столбцов 'two' и 'three', которые изначально представлены как объект (строка). Вот пример, как это сделать:

import pandas as pd

# Исходные данные
a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])

# Вывод DataFrame
print(df)

# Проверка типов данных
print(df.dtypes)

# Преобразование столбцов 'two' и 'three' в тип float
df[['two', 'three']] = df[['two', 'three']].astype(float)

# Проверка типов данных после преобразования
print(df.dtypes)

Результат будет следующий:

  one  two three
0   a  1.2   4.2
1   b   70  0.03
2   x    5     0

one      object
two      object
three    object

one       object
two      float64
three    float64

Таким образом, теперь столбцы 'two' и 'three' имеют тип float64, что позволяет проводить математические операции над ними.

0

Данный код изменяет тип данных столбца в DataFrame.

df[['col.name1', 'col.name2', ...]] = df[['col.name1', 'col.name2', ...]].astype('data_type')

Вместо 'data_type' вы можете указать желаемый тип данных, как, например, str, float, int и т.д.

0

Вы можете изменить тип столбца в DataFrame на строковый с помощью следующей команды:

df = df.astype({"columnname": str})

Пример - для изменения типа столбца на строку

df - ваш DataFrame

0

Вот функция, которая принимает в качестве аргументов DataFrame и список столбцов, и приводит все данные в этих столбцах к числовому типу.

# df - это DataFrame, а column_list - список столбцов в виде строк (например, ["col1", "col2", "col3"])
# зависимости: pandas

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

Для вашего примера:

import pandas as pd

def coerce_df_columns_to_numeric(df, column_list):
    df[column_list] = df[column_list].apply(pd.to_numeric, errors='coerce')

a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
df = pd.DataFrame(a, columns=['col1', 'col2', 'col3'])

coerce_df_columns_to_numeric(df, ['col2', 'col3'])

В этом примере функция coerce_df_columns_to_numeric принимает DataFrame df и список столбцов ['col2', 'col3'], затем применяет pd.to_numeric() к указанным столбцам. Если преобразование не удастся, значения будут заменены на NaN благодаря параметру errors='coerce'.

0

Для создания двух датафреймов с разными типами данных в колонках и их последующего объединения в один, вы можете использовать следующий код:

import pandas as pd

# Создаем первый датафрейм с одной колонкой типа float
d1 = pd.DataFrame(columns=['float_column'], dtype=float)

# Создаем второй датафрейм с одной колонкой типа str
d2 = pd.DataFrame(columns=['string_column'], dtype=str)

# Объединяем оба датафрейма
d1 = d1.append(d2, ignore_index=True)

# Проверяем типы данных в итоговом датафрейме
print(d1.dtypes)

Результат выполнения:

float_column     float64
string_column     object
dtype: object

После создания датафрейма, вы можете заполнить первый столбец значениями с плавающей точкой, а второй столбец - строками (или любыми другими типами данных по вашему выбору). Просто помните, что если вы хотите сохранить разные типы данных в одном датафрейме, используйте object как тип для целого датафрейма, чтобы избежать возможных проблем с типами данных.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь