如何有条件地修改dataframe列中的字符串值 - Python / Pandas

时间:2018-04-05 02:15:06

标签: python string pandas

我有一个数据框,其中一列('实体)包含国家和非国家实体的各种名称。我需要清理列,因为字符串值(由手动数据输入提供)都是小写的(中国而不是中国)。我不能只对列执行.title()操作,因为有些字符串值我不想做任何事情(例如,不应该把某些东西变成AL Something)。

我无法创建一个功能来帮助我解决这个问题,并且可以使用社区的一些指导。在过去,我使用字典帮助使用正确的字符串来帮助映射/替换不正确的字符串,我仍然可以恢复到这种方式,但我认为创建此函数可能更直接,更有效,而且我想挑战自己。但是当我执行函数时,实体列没有发生任何变化。提前谢谢!

implementation fileTree(include: ['*.jar', '*.aar'], exclude: 'test_aar*', dir: 'libs')
debugImplementation files('libs/test_aar-debug.aar')
releaseImplementation files('libs/test_aar-release.aar')

2 个答案:

答案 0 :(得分:0)

entities中的entities = df['entity'] 与行entities中的def title_fix(entities):不是同一个变量。第二个entities变量是函数title_fix的参数,它只存在于函数中。它会将您传递给title_fix的{​​{1}}调用的任何参数转换为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']中的目标字符串匹配,否则目标字符串将不会被替换。

答案 1 :(得分:0)

您的代码有多个错误,例如拼写和缩进。固定代码:

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个解决方案。我不太了解大熊猫,我不知道这些解决方案之间的性能差异,但在这里它们是。

ignoredmyString更有意义,所以我会使用它。

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()