【问题标题】:How to add a new column and fill it up with a specific value depending on another column's series?如何添加新列并根据另一列的系列填充特定值?
【发布时间】:2020-04-21 19:58:08
【问题描述】:

我是 Pandas 的新手,但感谢 Add column with constant value to pandas dataframe 我能够使用

一次添加不同的列
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 个产品 == 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  

我可以做的是找到所有唯一的订单号,然后过滤掉子帧,检查产品列的袋子,如果找到,则在新列中添加 1,否则为 0,然后将原始子帧替换为结果.

可能有更好的方法来实现这一点,而且性能也更高。

我尝试这样做的主要原因是为了在以后平息事情。每个订单都应成为具有某些产品值的 1 行。我不再需要 Bag 的信息,但如果原始订单曾经有 Bag (1) 或没有 Bag (0),我想保留在我的数据框中。

最终,当数据被清除后,它可以用作 scikit-learn 的基础(或者这就是我希望的)。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果我理解正确,你想要GroupBy.transform.any

    首先,我们通过检查Product 中的哪些行是BagSeries.eq 创建一个布尔数组。然后我们在这个布尔数组上GroupBy 并检查值中的any 是否为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 作为类型。我仍然需要清理数据中的很多内容(并且会以与您描述的相同的方式添加很多其他列)。
    • 嗨@Erfan,你能详细说明一下吗?转换中的“任何”是什么?还是按数据框分组的任何函数:pandas.pydata.org/pandas-docs/stable/reference/api/…
    • 发现了一篇关于此转换功能的有趣文章:pbpython.com/pandas_transform.html
    猜你喜欢
    • 2020-02-17
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多