Pandas преобразование поплавков в строки без десятичных знаков
У меня есть dataframe
df = pd.DataFrame([
['2', '3', 'nan'],
['0', '1', '4'],
['5', 'nan', '7']
])
print df
0 1 2
0 2 3 nan
1 0 1 4
2 5 nan 7
Я хочу преобразовать эти строки в числа и суммировать столбцы и преобразовать обратно в строки.
Использование astype(float)
похоже, приводит меня к номеру. Тогда суммирование легко с sum()
. Тогда вернуться к строкам также должно быть легко с помощью astype(str)
df.astype(float).sum().astype(str)
0 7.0
1 4.0
2 11.0
dtype: object
Это то, чего я хотел. Мне нужна строковая версия целых чисел. Но поплавки имеют десятичные значения. Как я могу избавиться от них?
Я хочу этого
0 7
1 4
2 11
dtype: object
Ответы
Ответ 1
Добавьте в микс astype(int)
:
df.astype(float).sum().astype(int).astype(str)
0 7
1 4
2 11
dtype: object
Демонстрация примера с пустыми ячейками. Это не было требованием от OP, но для удовлетворения противников
df = pd.DataFrame([
['2', '3', 'nan', None],
[None, None, None, None],
['0', '1', '4', None],
['5', 'nan', '7', None]
])
df
0 1 2 3
0 2 3 nan None
1 None None None None
2 0 1 4 None
3 5 nan 7 None
Тогда
df.astype(float).sum().astype(int).astype(str)
0 7
1 4
2 11
3 0
dtype: object
Поскольку OP не указывал, что они хотели бы сделать, когда столбец был пропущен, представление нуля - разумный вариант.
Однако мы могли бы также удалить эти столбцы
df.dropna(1, 'all').astype(float).sum().astype(int).astype(str)
0 7
1 4
2 11
dtype: object
Ответ 2
Преобразование в int
(т.е. с помощью .astype(int).astype(str)
) не будет работать, если столбец содержит нули; часто лучше использовать форматирование строк, чтобы явно указать формат столбца строки:
In [52]: df.astype(float).sum().applymap(lambda x: "{:.0f}".format(x))
Out[52]:
0 7
1 4
2 11
dtype: object
Ответ 3
Добавьте astype(int)
прямо перед преобразованием в строку:
print (df.astype(float).sum().astype(int).astype(str))
Создает желаемый результат.