Я скачал датафреймы отсюда: 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.
Без доступа к вашему 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 рад, что это помогло! подумайте о том, чтобы принять его в соответствии с рекомендациями: stackoverflow.com/help/someone-answers
Ответ @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
это замена всех значений столбца за один раз, а не итерация полей?