使用lamdas根据当前列的内容生成新的数据框列

时间:2019-08-28 01:29:13

标签: python pandas

我有一个简单的数据框,其中的列分别标记为“车辆”,“红色”,“蓝色”。 “车辆”列具有一个列表,其中包括“红色汽车”,“蓝色卡车”等项目。我想根据“车辆”(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的新手,所以对此有点挣扎。

3 个答案:

答案 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错误,而是熊猫错误。