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:上的函数吗?找到了一篇关于此转换功能的有趣文章:。