[英]How to conditionally modify string values in dataframe column - Python/Pandas
我有一个数据框,其中的一栏(实体)包含国家和非国家实体的各种名称。 我需要清理列,因为字符串值(由手动数据输入提供)都是小写的(china而不是China)。 我不能只对列执行.title()操作,因为有些字符串值我什么都不做(例如,al Something不应变成AL Something)。
我在创建一个函数来解决此问题时遇到了麻烦,可以使用社区中的一些指导。 过去,我曾使用词典来帮助将不正确的字符串映射/替换为正确的字符串,但我仍然可以恢复这种处理方式,但是我认为创建此函数可能更直接,更有效,而且我想挑战自己。 但是当我执行函数时,实体列没有发生任何变化。 提前致谢!
myString = ['al Group1', 'al Group2']
entities = df['entity']
def title_fix(entities):
new_titles = []
for entity in entities:
if entity in myString:
new_titles.append(myString)
else:
new_title.append(entity.title())
return new_title
title_fix(df)
该entities
在线路entities = df['entity']
是不一样的变量作为entities
的线def title_fix(entities):
第二个entities
变量是函数title_fix
的参数,并且仅存在于函数中。 它接受您传递给title_fix
的调用中传递的任何参数,即df
。
试试这个代替你的功能:
# A list of entity names to leave alone (must exactly match character-for-character)
myString = ['al Group1', 'al Group2']
# Apply title case to every entity NOT in myString
df['entity'] = df['entity'].apply(lambda x: x if x in myString else x.title())
# Print the modified DataFrame
df
请注意,此解决方案要求myString
中的每个字符串与df['entity']
中的目标字符串完全匹配,否则将不替换目标字符串。
您的代码有几个错误,例如拼写和缩进。 固定代码:
myString = ['al Group1', 'al Group2']
entities = df['entity']
def title_fix(entities):
new_titles = []
for entity in entities:
if entity in myString:
new_titles.append(entity)
else:
new_titles.append(entity.title())
return new_titles
df['entity'] = title_fix(entities)
但是,您想要实现的目标可以一站式完成。 我想出了3种解决方案。 我不太了解熊猫,我也不知道这些解决方案之间的性能差异,但是在这里。
ignored
比myString
更有意义,因此我将使用它。
ignored = ['al Group1', 'al Group2']
第一个解决方案:
df['entity'] = df['entity'].apply(lambda x: x.title() if x not in ignored else x)
第二:
df.entity[~df.entity.isin(ignored)] = df.entity.str.title()
第三:
df.loc[~df.entity.isin(ignored), 'entity'] = df.entity.str.title()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.