首页 > 解决方案 > 如何在熊猫中有条件地修改列中的单元格?

问题描述

我有一个 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]

我在这里收到警告,但这种工作。问题是它只包含以前加星标的人,而不是全部。

我对此有点陌生,所以如果这很简单,我很抱歉。我觉得应该不会太难,应该有一些功能可以做到这一点,但我不知道它是什么。

标签: pythonpandasdataframe

解决方案


您的语法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

如果您只指定索引器的第一部分,您将仅按行标签过滤并返回一个数据框。您不能将系列分配给数据框。


推荐阅读