如何替换包含列表字典中给出的子字符串的数据框中的字段并避免ValueError?

我有一个像这样的 Pandas 数据框(作者、标题和年份不相关,因此 A、T 和 Y):


Author  Title  Year  Country    

A       T      Y     UK. cat@mail.uk

A       T      Y     U.S.A.

A       T      Y     University of Cambridge

A       T      Y     United Kingdom

A       T      Y     somename@uconn.edu

我想要实现的是一个带有“干净”国家列的数据框:


Author  Title  Year  Country    

A       T      Y     UK

A       T      Y     USA

A       T      Y     UK

A       T      Y     UK

A       T      Y     USA

为此,我创建了一个(列表)字典:


UK = ['UK.', 'Cambridge', 'United Kingdom']

USA = ['U.S.A.', 'conn.edu']

my_dict = {'UK': UK, 'USA': USA}

输入以下函数进行清理:


def clean_country(country_dict):

    for key in country_dict:

        for value in country_dict[key]:

            if df['Country'].str.contains(value):

                df['Country'] = np.where(value, key, df['Country'].str.replace('-', ' '))

            return df

        else:

            continue


clean_country(my_dict)

但我收到以下错误:


Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

  File "<stdin>", line 4, in clean_country

  File "/Users/birgitte/PycharmProjects/text/venv/lib/python3.7/site-packages/pandas/core/generic.py", line 1555, in __nonzero__

    self.__class__.__name__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

在函数内部使用以下内容时:


df['Country'].str.contains(value).all(): False(并非所有字段都包含该值)。没有更改任何国家/地区字段。


df['Country'].str.contains(value).any():真(某些字段包含值)。结果是ValueError: invalid literal for int() with base 10: 'UK'


df['Country'].str.contains(value).item(): 结果是ValueError: can only convert an array of size 1 to a Python scalar


df['Country'].str.contains(value).bool(): 导致ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().


非常欢迎任何关于如何实现“干净”国家专栏的帮助。


Qyouu
浏览 128回答 1
1回答

沧海一幻觉

您可以apply在 DataFrame 中使用该函数# Replacement logicdef replace(x):&nbsp; &nbsp; for key in country_dict:&nbsp; &nbsp; &nbsp; &nbsp; for value in country_dict[key]:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if value in x:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return key&nbsp; &nbsp; return x# use either ways:df['Country'] = df['Country'].apply(lambda x: replace(x))# ordf['Country'] = df['Country'].apply(replace)更新:正确使用替换方法并修复复制粘贴错误检查字符串中是否存在值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python