我写了一个python 3脚本
我有一个专栏' original_title',我有不同的电影片名i.a.所有电影的星球大战(+剧集的名称)和星际迷航(+剧集的名称)。我想创建一个专栏,只显示我的星际迷航' (没有剧集的名称),'星球大战'和' 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
我该怎么办?
答案 0 :(得分:2)
我假设您正在使用熊猫。我不知道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
答案 1 :(得分:0)
在你的例子中,“星球大战”和“星际迷航”这两个值包含相同数量的字符(9),你可以将字符串分成前9个字母。 但是为了更精细地解析该列,您需要找到更好的方法。
X['Film_Series'] = 0
for ind, row in df.iterrows():
X['Film_Series'].loc[ind] = X['film_name'].loc[ind].str[:9]