Python 条件If语句:若值包含字符串,则将另一列设置为字符串

Python 条件If语句:若值包含字符串,则将另一列设置为字符串,python,string,pandas,if-statement,dataframe,Python,String,Pandas,If Statement,Dataframe,我写了一个Python3脚本 我有一个“原创标题”专栏,其中我有不同的电影标题,即所有《星球大战》(剧集名称)和《星际迷航》(剧集名称)。我想创建一个专栏,只显示《星际迷航》(没有插曲名称)、《星球大战》和《na》 这是我的新列代码: df['Trek_Wars'] = pd.np.where(df.original_title.str.contains("Star Wars"), "star_wars", pd.np.where(df.original_titl

我写了一个Python3脚本


我有一个“原创标题”专栏,其中我有不同的电影标题,即所有《星球大战》(剧集名称)和《星际迷航》(剧集名称)。我想创建一个专栏,只显示《星际迷航》(没有插曲名称)、《星球大战》和《na》

这是我的新列代码:

df['Trek_Wars'] = pd.np.where(df.original_title.str.contains("Star Wars"), "star_wars", 
              pd.np.where(df.original_title.str.contains("Star Trek"), "star_trek"))
但是,它不起作用

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-33-5472b36a2193> in <module>()
      1 df['Trek_Wars'] = pd.np.where(df.original_title.str.contains("Star Wars"), "star_wars",
----> 2                    pd.np.where(df.original_title.str.contains("Star Trek"), "star_trek"))

ValueError: either both or neither of x and y should be given
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1 df['Trek_Wars']=pd.np.where(df.original_title.str.contains(“星球大战”),“星球大战”,
---->2 pd.np.其中(df.原始标题str.包含(“星际迷航”),“星际迷航”))
ValueError:应同时给出x和y或两者都不给出

我该怎么办?

我想你在用熊猫。我不知道有
pd.np.where
方法,但有
np.where
,可以用于您的任务:

df['Trek_Wars'] = np.where(df['original_title'].str.contains('Star Wars'),
                           'star_wars', 'na')
请注意,我们必须提供满足条件和不满足条件时的值。对于多种情况,您可以使用
pd.DataFrame.loc

# set default value
df['Trek_Wars'] = 'na'

# update according to conditions
df.loc[df['original_title'].str.contains('Star Wars'), 'Trek_Wars'] = 'star_wars'
df.loc[df['original_title'].str.contains('Star Trek'), 'Trek_Wars'] = 'star_trek'
您可以通过字典映射进一步简化逻辑:

# map search string to update string
mapping = {'Star Wars': 'star_wars', 'Star Trek': 'star_trek'}

# iterate mapping items
for k, v in mapping.items():
    df.loc[df['original_title'].str.contains(k), 'Trek_Wars'] = v

我猜你在用熊猫。我不知道有
pd.np.where
方法,但有
np.where
,可以用于您的任务:

df['Trek_Wars'] = np.where(df['original_title'].str.contains('Star Wars'),
                           'star_wars', 'na')
请注意,我们必须提供满足条件和不满足条件时的值。对于多种情况,您可以使用
pd.DataFrame.loc

# set default value
df['Trek_Wars'] = 'na'

# update according to conditions
df.loc[df['original_title'].str.contains('Star Wars'), 'Trek_Wars'] = 'star_wars'
df.loc[df['original_title'].str.contains('Star Trek'), 'Trek_Wars'] = 'star_trek'
您可以通过字典映射进一步简化逻辑:

# map search string to update string
mapping = {'Star Wars': 'star_wars', 'Star Trek': 'star_trek'}

# iterate mapping items
for k, v in mapping.items():
    df.loc[df['original_title'].str.contains(k), 'Trek_Wars'] = v

在您的示例中,“星球大战”和“星际迷航”这两个值都包含相同数量的字符(9),您可以将字符串拆分为前9个字母。 但要更精细地解析该列,您需要找到更好的方法

X['Film_Series'] = 0
for ind, row in df.iterrows():
    X['Film_Series'].loc[ind] = X['film_name'].loc[ind].str[:9]

在您的示例中,“星球大战”和“星际迷航”这两个值都包含相同数量的字符(9),您可以将字符串拆分为前9个字母。 但要更精细地解析该列,您需要找到更好的方法

X['Film_Series'] = 0
for ind, row in df.iterrows():
    X['Film_Series'].loc[ind] = X['film_name'].loc[ind].str[:9]

你用什么语言写的?请给它贴上标签你用什么语言写的?请标记itI不知道的
pd.np.where
,在iPython中尝试了它,并震惊地发现它确实有效。我现在正在浏览源代码,因为我不理解它的用途;用谷歌搜索它并不容易:)我不知道
pd.np.where
,在iPython尝试了它,并震惊地发现它确实有效。我现在正在浏览源代码,因为我不理解它的用途;用谷歌搜索并不容易:)