Python панды конвертируют одно значение в столбце объекта - PullRequest
0 голосов
/ 13 сентября 2018

Решено ниже

Проблема: Невозможно .groupby() сортировать, поскольку одно значение является объектом типа string.Значение в Index 5, ColA 10 для Data In является проблемой.Значение Index 5 для ColA, 10 является строковым объектом.pd.to_numeric() правильно сортирует столбец, если сортируется только по этому столбцу.

Вопрос: Можно ли преобразовать одно значение в ColA?

Метод:

ind = pd.to_numeric(df['ColA'], errors='coerce').fillna(999).astype(int).argsort()
df = df.reindex(ind)
df = df.groupby(df.ColA).apply(pd.DataFrame.sort_values, 'ColB')
df = df.reset_index(drop=True)

Данные в:

Index     ColA     ColB     ColC
0         2        14-5     MumboJumbo
1         4        18-2     MumboJumbo2
2         2        24-5     MumboJumbo3
3         3        23-8     MumboJumbo4
4         2        13-6     MumboJumbo5
5         10       86-1     MumboJumbo6
6         10       42-1     MumboJumbo7
7         2        35-6     MumboJumbo8
8         Load     NaN      MumboJumbo9

Желаемый вывод:

Index     ColA     ColB     ColC
0         2        13-6     MumboJumbo5
1         2        14-5     MumboJumbo
2         2        24-5     MumboJumbo3
3         2        35-6     MumboJumbo8
4         3        23-8     MumboJumbo4
5         4        18-2     MumboJumbo2
6         10       42-1     MumboJumbo7
7         10       86-1     MumboJumbo6
8         Load     NaN      MumboJumbo9

Спасибо!

1 Ответ

0 голосов
/ 13 сентября 2018

Я не совсем понимаю проблему в вопросе, но вы можете выбрать конкретные значения в DataFrame, используя iloc (позиционный индекс) или loc (индекс метки). Поскольку вы просите заменить значение в пятой строке первого столбца в наборе данных, мы используем iloc.

df.iloc[from_row:to_row,column_position]

Чтобы преобразовать значение '10' в ColA в строке 5 в int('10'), просто выберите его и обновите.

df.iloc[5:6,0] = 10

Если вы не знаете, где находится значение, которое необходимо преобразовать, iloc и loc не помогут.

Существует несколько способов преобразовать все значения в столбце в конкретный dtype. Одним из способов было бы использование lambda -функции.

df[column_name].apply(lambda x: int(x))

Выше lambda сломается, потому что ваши данные также содержат строку Load, и вы не можете преобразовать это в int. Одним из способов решения этой проблемы является добавление условий к вашему lambda.

df[column_name].apply(lambda x: int(x) if something else something)

Учитывая данные в вашем вопросе, самый простой способ - проверить, не является ли x 'Load':

df[column_name].apply(lambda x: int(x) if x != 'Load' else x)

Это становится хлопотом, если в вашем столбце есть множество реальных строк. Если вы хотите использовать lambda, вы можете составить список реальных строк. А затем проверьте, есть ли x в списке.

list_of_strings = ['Load', 'Road', 'Toad']
df[column_name].apply(lambda x: int(x) if x not in list_of_strings else x)

Другим способом было бы написать отдельную функцию для управления преобразованием с использованием блоков try / catch.

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