【问题标题】:Append a new column based on existing columns基于现有列添加新列
【发布时间】:2017-01-11 02:27:40
【问题描述】:

这里是熊猫新手。

我正在尝试在我的数据框中创建一个新列,当我将其输入分类器时,该列将用作训练标签。

如果给定的 Id 对于 Apples 或 Pears 具有 (Value1 > 0) 或 (Value2 > 0),则标签列的值为 1.0,否则为 0.0。

我的数据框是由 Id 索引的行,如下所示:

Out[30]: 
                Value1                                               Value2  \
    ProductName    7Up     Apple Cheetos     Onion      Pear PopTart    7Up   
    ProductType Drinks Groceries  Snacks Groceries Groceries  Snacks Drinks   
Id                                                                        
100                0.0       1.0     2.0       4.0       0.0     0.0    0.0   
101                3.0       0.0     0.0       0.0       3.0     0.0    4.0   
102                0.0       0.0     0.0       0.0       0.0     2.0    0.0   


    ProductName     Apple Cheetos     Onion      Pear PopTart  
    ProductType Groceries  Snacks Groceries Groceries  Snacks  
Id                                                         
100                   1.0     3.0       3.0       0.0     0.0  
101                   0.0     0.0       0.0       2.0     0.0  
102                   0.0     0.0       0.0       0.0     1.0  

如果 pandas 向导可以帮助我了解此操作的语法 - 我的大脑正在努力将它们放在一起。

谢谢!

【问题讨论】:

    标签: python pandas numpy sklearn-pandas


    【解决方案1】:

    @vlad.rad 提供的答案有效,但效率不高,因为 pandas 必须在 Python 中手动循环所有行,无法利用 numpy 矢量化函数加速。以下矢量化解决方案应该更有效:

    condition = (df['Value1'] > 0) | (df['Value2'] > 0)
    df.loc[condition, 'label'] = 1.
    df.loc[~condition, 'label'] = 0.
    

    【讨论】:

    • 是的,这实际上很有意义(我有点尴尬,我最初没有想到它)。问题是我在 df.loc[condition, 'label'] = 1 上遇到内存错误我的数据不是特别大(450k 行,4.5k 列,并且我在系统上运行 Python 3.5 64 位虽然有 32 gigs 的 RAM)...我应该补充一点,我的条件实际上是 6 或 7 个条件(检查值 1 到 7)。
    • 450k 行不是很多,但可能是 4.5k 列。您可能需要考虑 dask 等软件包。
    【解决方案2】:

    定义你的功能:

    def new_column (x):
           if x['Value1'] > 0 :
              return '1.0'
           if x['Value2'] > 0 :
              return '1.0'
           return '0.0'
    

    将其应用于您的数据:

    df.apply (lambda x: new_column (x),axis=1)
    

    【讨论】:

    • 我想我也需要指定正确的多索引。所以 x[('Value1', 'Apple')] > 0 等等。另外,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2021-05-12
    • 2019-09-10
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多