我有一个简单的数据框,其中的列分别标记为“车辆”,“红色”,“蓝色”。 “车辆”列具有一个列表,其中包括“红色汽车”,“蓝色卡车”等项目。我想根据“车辆”(Vehicle)列的内容用“ True”或“ False”填充“红色”和“蓝色”列。到目前为止我最糟糕的尝试:
df['Red'] = df.apply(lambda num: df['Vehicles'] == 'Red Truck'
or df['Vehicles'] == 'Red Car')
ValueError :(“系列的真值不明确。请使用a.empty,a.bool(),a.item(),a.any()或a.all()。”,“发生于索引计数”)
我是Python的新手,所以对此有点挣扎。
答案 0 :(得分:2)
我认为这更像是一个get_dummies
问题
s=df.Vehicles.str.extract('(Red|Blue|Green)')[0].str.get_dummies()
df=pd.concat([df,s],axis=1)
df
Vehicles Blue Green Red
0 Red Truck 0 0 1
1 Blue Car 1 0 0
2 Red Car 0 0 1
3 Green Van 0 1 0
答案 1 :(得分:1)
如果您只是在寻找目标字符串,最简单的方法是使用.str.contains()
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
In [2]: df = pd.DataFrame({'Vehicles': ["Red Truck", "Blue Car", "Red Car", "Green Van"]})
In [3]: df
Out[3]:
Vehicles
0 Red Truck
1 Blue Car
2 Red Car
3 Green Van
In [4]: df['Red'] = df['Vehicles'].str.contains('Red')
In [5]: df
Out[5]:
Vehicles Red
0 Red Truck True
1 Blue Car False
2 Red Car True
3 Green Van False
答案 2 :(得分:1)
每当您看到“一个系列的真实价值是模棱两可的”时,您很有可能在DataFrame而不是系列上进行操作。相反,请尝试以下操作,以使您理解此块,并记住它:
df['Red'] = df['Vehicles'].apply(lambda num: num == 'Red Truck' or num == 'Red Car').astype(int)
然后可能会忘记它,然后尝试其他答案之一,因为它们可能比使用lambda更快。
请注意,我所做的操作是在df['Vehicles']
而不是df
上进行的。在df
上进行操作会将整行传递给您的lambda,这不是您想要的。它不是Python错误,而是熊猫错误。