Python 如何添加新列并根据另一列使用特定值填充它';s系列?

Python 如何添加新列并根据另一列使用特定值填充它';s系列?,python,pandas,Python,Pandas,我对熊猫还不熟悉,但多亏了它,我可以用它一次添加不同的栏目 c = {'new1': 'w', 'new2': 'y', 'new3': 'z'} df.assign(**c) 然而,当我想向数据帧添加一个新列时(目前为120万行*23列),我试图找出应该采取的路径 让我们稍微简化一下df,并尝试使其更清晰: Order Orderline Product 1 0 Laptop 1 1 Bag 1

我对熊猫还不熟悉,但多亏了它,我可以用它一次添加不同的栏目

c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)
然而,当我想向数据帧添加一个新列时(目前为120万行*23列),我试图找出应该采取的路径

让我们稍微简化一下df,并尝试使其更清晰:

Order   Orderline   Product  
1       0           Laptop  
1       1           Bag  
1       2           Mouse  
2       0           Keyboard  
3       0           Laptop  
3       1           Mouse  
我想添加一个新列,根据订单中是否至少有1个product==Bag,它应该是1(对于该特定订单的所有行),否则为0

结果将是:

Order   Orderline   Product   HasBag  
1       0           Laptop    1  
1       1           Bag       1  
1       2           Mouse     1  
2       0           Keyboard  0  
3       0           Laptop    0  
3       1           Mouse     0  
我可以做的是找到所有唯一的订单号,然后过滤掉子帧,检查产品列中的Bag,如果找到,则将1添加到新列中,否则为0,然后用结果替换原始子帧

很可能有更好的方式来实现这一点,也有更高效的方式

我尝试这样做的主要原因是为了以后把事情弄得更简单。每个订单都应该成为一行,带有产品的某些值。我不再需要行李的信息,但如果原始订单中有行李(1)或没有行李(0),我希望保留在数据框中


最终,当数据被清除后,它可以作为scikit学习的基础(或者我希望如此)。

如果我理解正确,您需要
GroupBy.transform.any

首先,我们使用
Series.eq
检查
Product
中的哪些行是
Bag
,从而创建一个布尔数组。然后,我们在这个布尔数组上执行
GroupBy
,并检查
是否有任何
值是
True
。我们使用
transform
来保持初始数组的形状,以便重新分配值

df['ind'] = df['Product'].eq('Bag').groupby(df['Order']).transform('any').astype(int)

   Order  Orderline   Product  ind
0      1          0    Laptop    1
1      1          1       Bag    1
2      1          2     Mouse    1
3      2          0  Keyboard    0
4      3          0    Laptop    0
5      3          1     Mouse    0

谢谢我需要将
astype(float)
作为一个类型,因为有些值是NaN,它没有将int作为类型。我仍然需要清理大量的数据(并且将以与您描述的相同的方式添加大量其他列)?转换中的“任何”是什么意思?或者它是grouped by dataframe:上的函数吗?找到了一篇关于此转换功能的有趣文章:。