Pandas - Datatype Object - .loc не работает с числами - PullRequest
0 голосов
/ 28 февраля 2019

поэтому у меня есть очень простой скрипт для панд, который я использую для замены значений в Excel другими значениями.Существует один столбец (Fm), который не работает, когда я пытаюсь заменить числовые значения.Столбец Fm dtype является объектом.Но это просто не будет работать, когда я пытаюсь заменить значение 350 (прокомментировал в моем коде строку), но все остальное работает.Я не могу прикрепить файл к stackoverflow и не чувствую себя комфортно при создании ссылки, потому что я нахожусь на рабочей машине.Кто-нибудь видел проблему такого рода?

import pandas as pd
import numpy as np
data = pd.read_excel("2.27.xlsm", encoding = "ISO-8859-1", dtype=object)
data.loc[data.F == 'DBD', 'F'] = 'BFD'
data.loc[data.Fm == '350', 'Fm'] = 'test' # this line does not work
data.loc[data.Fm == 'B25', 'F'] = 'BFD'
data.loc[data.Fm == 'B50', 'F'] = 'BFD'

writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
data.to_excel(writer, sheet_name='Sheet1')
writer.save()

Name: Fm, Length: 1521, dtype: object

- Извините, у меня есть вторая часть этого вопроса, начинающаяся здесь ниже, поскольку строки 7-8, по-видимому, сводят на нет 1-6? -----

Привет, у меня есть пример сценария ниже, который я запускаю в файле Excel.По существу, после строка 6 Я хочу отфильтровать строки, содержащие BFD и SFD в столбце F (я знаю, что только что присвоил эти значения в приведенном выше коде, и другие из этих значений также существовали вразные строки до сценария).После этого просто примените логику в строках 7-8 к фрейму данных.Поэтому, по сути, вы используете pandas для фильтрации строк по значению ячейки в столбце, затем применяете логику к тому, что не было отфильтровано, а затем просто не фильтруете все (как если бы вы должны были очистить фильтры в Excel), и мой фрейм данных был готов к работе

import pandas as pd
import numpy as np
data = pd.read_excel("2.27.xlsm", encoding = "ISO-8859-1", dtype=object)
data.loc[data.F == 'DBD', 'F'] = 'BFD'
data.loc[data.F == 'DUB', 'F'] = 'BFD'
data.loc[data.F == 'DCD', 'F'] = 'SFD'
#Now I want to apply this logic and filter out any rows that have values of BFD or SF in column F and then apply to logic below (to not overwrite any work done above)
data.loc[data.Fm == 'B25', 'F'] = 'BFD'
data.loc[data.Fm == 'B50', 'F'] = 'BFD'

writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter')
data.to_excel(writer, sheet_name='Sheet1')
writer.save()

1 Ответ

0 голосов
/ 28 февраля 2019

У меня была похожая ситуация при слиянии, я думаю, что может случиться так, что, хотя столбец является объектом, каждая ячейка рассматривается отдельно при выполнении сравнений.Это означает, что если вы хотите использовать или смешивать типы данных в столбцах, вы должны установить для этого столбца (в данном случае) строки перед выполнением сравнений.

Попробуйте:

dafa.loc[:,'Fm'] = data.Fm.astype(str) 

Это преобразует все ваши ячейки в строки (например, 350 будет 350 ')

Тогда:

data[data.Fm == '350', 'Fm'] = 'test' 

К вашему сведению: я не думаю, что вам нужен .loc в этом cas.

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