Подтвердить что ты не робот

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
4b9b3361

Ответ 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))

Создает желаемый результат.