python - 如何在熊猫中有条件地修改列中的单元格?
问题描述
我有一个 csv 数据集,无论出于何种原因,它在某些名称的末尾都有一个额外的星号 (*)。我正在尝试删除它们,但我遇到了麻烦。我只想替换以 * 结尾的名称,否则保持原样。
我尝试了以下几种变体,但收效甚微。
import pandas as pd
people = pd.read_csv("people.csv")
people.loc[people["name"].str[-1] == "*"]] = people["name"].str[:-1]
在这里,我收到以下错误:
ValueError: Must have equal len keys and value when setting with an iterable
我理解为什么这是错误的,但我不确定如何引用我想要更改的值。
我可以改为执行以下操作:
starred = people.loc[people["name"].str[-1] == "*"]
starred["name"] = starred["name"].str[:-1]
我在这里收到警告,但这种工作。问题是它只包含以前加星标的人,而不是全部。
我对此有点陌生,所以如果这很简单,我很抱歉。我觉得应该不会太难,应该有一些功能可以做到这一点,但我不知道它是什么。
解决方案
您的语法pd.DataFrame.loc
需要包含列标签:
df = pd.DataFrame({'name': ['John*', 'Rose', 'Summer', 'Mark*']})
df.loc[df['name'].str[-1] == '*', 'name'] = df['name'].str[:-1]
print(df)
name
0 John
1 Rose
2 Summer
3 Mark
如果您只指定索引器的第一部分,您将仅按行标签过滤并返回一个数据框。您不能将系列分配给数据框。
推荐阅读
- svelte - Svelte:数组变异和重新分配不会触发 #each 块中的重新渲染
- google-bigquery - 如何重复 BigQueryOperator Dag 并将不同的日期传递给我的 sql 文件
- java - 如何在java中将json嵌套数组转换为多维arraylist?
- android - 配置 Spinner 以显示用户友好的措辞,但在选择时应通过 Android 中的代码
- java - 如何用括号对多个三元运算符进行分组
- r - 如何使用错误处理在 R 中导出 NA 数据?
- subdomain - 是否可以从域名指向特定端口?
- javascript - 使用 JavaScript 设置基本 SVG 元素的属性
- google-analytics - 如何使用 GA4 衡量协议衡量会话/用户?
- java - 大学 Eclipse 中的 JavaFX 配置源代码未显示“配置问题严重性”