我有一个带有列性别的数据框。它由性别预测组成。现在,“性别”列具有诸如mostly_male,mostly_female的值。我想删除大部分。所以我尝试了df['gender'] = df['gender'].map(lambda x: x.lstrip('mostly_'))
但是我得到了一个列,其中“ male”的值对应于“ ale”
答案 0 :(得分:4)
您应该使用replace:
df['gender'] = df['gender'].str.replace('mostly_', '')
这会将“ mostly_”的所有完全匹配项替换为空白的“”。如果在传递的字符串中找到前导字符,您的示例将从行中删除前导字符。因此lstrip找到了“ m”,并删除了“ mostly_”,但是由于“ male”中存在一个“ m”,因此也会将其删除。
答案 1 :(得分:4)
pandas.DataFrame.replace
您可以将字典传递给此方法,以指定要使用的列
df.replace({'gender': {'mostly_': ''}}, regex=True)
pandas.Series.str.replace
优点是您无需指定regex=True
df.gender.str.replace('mostly_', '')
pandas.Series.str
投票“最可能”打破。但是,如果您知道所有条目都以"mostly_"
开头,那么为什么
df.gender.str[7:]
pandas.Series.map
我不喜欢其他选项,因为它们都涉及字符串操作。您可以使用字典映射更加明确,并保持恒定时间查找
df.gender.map({'mostly_male': 'male', 'mostly_female': 'female'})
df = pd.DataFrame(dict(gender=[f"mostly_{g}" for g in ['male', 'female'] * 10000]))
%timeit df.replace({'gender': {'mostly_': ''}}, regex=True)
%timeit df.gender.str.replace('mostly_', '')
%timeit df.gender.str[7:]
%timeit df.gender.map({'mostly_male': 'male', 'mostly_female': 'female'})
100 loops, best of 3: 12.8 ms per loop
100 loops, best of 3: 16.1 ms per loop
100 loops, best of 3: 5.42 ms per loop
1000 loops, best of 3: 1.8 ms per loop
答案 2 :(得分:0)
您可以使用replace
删除不需要的字符串。 lstrip
将删除所有符合条件的字符。有关详细信息,lstrip docs
也可以使用正则表达式库替换子字符串
import re
df['gender'].map(lambda x: re.sub('^mostly_','',x))