Df.loc для замены чисел, разделенных запятыми, в кадрах данных

Я скачал датафреймы отсюда: https://ods.od.nih.gov/HealthInformation/Dietary_Reference_Intakes.aspx

используя BeautifulSoup, но некоторые числовые значения имеют разделитель тысяч и «звездочки», которые я хочу удалить. У меня есть регулярное выражение для удаления «звездочек», но я попытался использовать str.replace («»,», «») для запятой, а затем вставить новую строку с помощью .loc. Мой код:

#iterate each df field and if comma sep, replace
for name,df in df_dict.items():
    print(name, df.dtypes)
    cols = list(df.columns)
    #print(cols)
    for idx, row in df.iterrows():
        # skip lifestage group col
        for i in range(1,len(cols)):
            curr_val = str(row[cols[i]])
            print(f'curr_val: {type(curr_val),curr_val}')
            print(f'row[0]:{row[cols[0]]}')
            if "," in curr_val:
                clean_val = curr_val.replace(",", "")
                print(f'comma: {df.loc[row[cols[0]], cols[i]]}')
                df.loc[row[cols[0]],cols[i]] = clean_val
                print(f'no comma: {df.loc[row[cols[0]], cols[i]]}\n')
            

df.dtypes показывает

Life-Stage Group     object
Calcium (mg/d)       object
Chromium (μg/d)      object
Copper (μg/d)        object
Fluoride (mg/d)      object
Iodine (μg/d)        object
Iron (mg/d)          object
Magnesium (mg/d)     object
Manganese (mg/d)     object
Molybdenum (μg/d)    object
Phosphorus (mg/d)    object
Selenium (μg/d)      object
Zinc (mg/d)          object
Potassium (mg/d)     object
Sodium (mg/d)        object
Chloride (g/d)       object
dtype: object

поэтому я думаю, что это должно работать, но на самом деле никаких изменений не происходит.

В идеале я хочу взять как запятые, так и «*» и просто сохранить значение int или float.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
297
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Без доступа к вашему df трудно вам помочь. Посмотрите, как предоставить отличный пример панд , а также минимальный, полный и проверяемый пример.

Но некоторые вещи в вашем коде выглядят подозрительно, в частности это: df.loc[row[cols[0]], cols[i]]. .loc функция принимает индекс df в качестве первого аргумента, поэтому я подумал, что это должно быть df.loc[idx, cols[i]] в нескольких местах. так что я немного удивлен, что на самом деле там не жалуются.

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

# loop over columns i here
df[cols[i]] = df[cols[i]].str.replace(',','').str.replace('*','')
df[cols[i]] = df[cols[i]].astype(float) # or int

это, как правило, гораздо предпочтительнее петли iterrows(), которая у вас есть

это замена всех значений столбца за один раз, а не итерация полей?

seizouki 13.12.2020 02:42

@seizouki рад, что это помогло! подумайте о том, чтобы принять его в соответствии с рекомендациями: stackoverflow.com/help/someone-answers

piterbarg 13.12.2020 07:47

Ответ @piterbarg был правильным. Отредактировано на это, и это работает:

#iterate each df field and if comma sep, replace
for name,df in df_dict.items():
    str_df = df.copy().astype(str)
    cols = list(df.columns)
    print(f'cols[0]: {cols[0]}')
    
    # skip lifestage group col
    for i in range(1,len(cols)):
        str_df[cols[i]] = str_df[cols[i]].str.replace(',', '').str.replace('*','')


    df_dict[name] = str_df

Другие вопросы по теме