python - 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 值。
解决方案
@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
推荐阅读
- entity-framework - 具有继承的嵌套属性
- freeradius - 在 ubuntu 18 中制作 freeradius 3 查看客户端“秘密”的 mysql nas 表
- curl - 向 Autodesk Forge 注册 client_id 和 client_secret 时出错
- mysql - MySQL UDF 响应附加到返回字符串的垃圾字符
- reactjs - 服务器重定向不适用于 ReactJS 代理服务器
- jspdf - AcroForm 签名功能
- list - 带有图标的离子 ion-list-header。可能吗?
- php - 在 Laravel 中进行测试时,我可以将 URL 推送到我的应用程序的“历史记录”中吗?
- python - 无法通过for循环将值分配给数组
- java - Hibernate 抛出一次“找到给定标识符的多行”,但此后不再抛出