【问题标题】:Creating a dummy varuable based on a criteria in pandas根据 Pandas 中的标准创建虚拟变量
【发布时间】:2017-10-11 12:26:03
【问题描述】:

我有一个这样的数据框:

date           sales      company    country 
16/03/2012     3000       H&M        US
13/04/2012     2300       H&M        US
26/03/2012     1230       H&M        FR
13/04/2012     1300       H&M        FR
23/03/2012     2230       H&M        IT
19/04/2012     1100       H&M        IT
16/03/2012     3000       ABC        US
13/04/2012     2300       ABC        US
26/03/2012     100        ABC        FR
13/04/2012     60         ABC        FR
23/03/2012     435        ABC        IT
19/04/2012     300        ABC        IT

我想定义一个标准:如果一家公司的(平均)销售额少于 50% 来自单一国家/地区,则该公司被视为国际公司。我想创建一个新列,如果它是国际的,则值为 1,否则为 0。最终输出应如下所示:

 date           sales      company    country   international
    16/03/2012     3000       H&M        US         1
    13/04/2012     2300       H&M        US         1
    26/03/2012     1230       H&M        FR         1
    13/04/2012     1300       H&M        FR         1
    23/03/2012     2230       H&M        IT         1
    19/04/2012     1100       H&M        IT         1
    16/03/2012     3000       ABC        US         0
    13/04/2012     2300       ABC        US         0
    26/03/2012     100        ABC        FR         0
    13/04/2012     60         ABC        FR         0
    23/03/2012     435        ABC        IT         0
    19/04/2012     300        ABC        IT         0

我怎么能做到这一点? P.S:数据集中可能缺少销售值,我怎么能说忽略这些值?

【问题讨论】:

    标签: python pandas dummy-variable


    【解决方案1】:

    使用transform 表示方法,将它们和groupby 与聚合all 进行比较,以检查所有值是否返回Trues:

    s2 = df.groupby('company')['sales'].transform('mean') / 2
    print (s2)
    0     930.00
    1     930.00
    2     930.00
    3     930.00
    4     930.00
    5     930.00
    6     516.25
    7     516.25
    8     516.25
    9     516.25
    10    516.25
    11    516.25
    Name: sales, dtype: float64
    
    s1 = df.groupby(['company', 'country'])['sales'].transform('mean')
    print (s1)
    0     2650.0
    1     2650.0
    2     1265.0
    3     1265.0
    4     1665.0
    5     1665.0
    6     2650.0
    7     2650.0
    8       80.0
    9       80.0
    10     367.5
    11     367.5
    Name: sales, dtype: float64
    

    df['international'] = (s1 > s2).groupby(df['company']).transform('all').astype(int)
    print (df)
              date  sales company country  international
    0   16/03/2012   3000     H&M      US              1
    1   13/04/2012   2300     H&M      US              1
    2   26/03/2012   1230     H&M      FR              1
    3   13/04/2012   1300     H&M      FR              1
    4   23/03/2012   2230     H&M      IT              1
    5   19/04/2012   1100     H&M      IT              1
    6   16/03/2012   3000     ABC      US              0
    7   13/04/2012   2300     ABC      US              0
    8   26/03/2012    100     ABC      FR              0
    9   13/04/2012     60     ABC      FR              0
    10  23/03/2012    435     ABC      IT              0
    11  19/04/2012    300     ABC      IT              0
    

    【讨论】:

    • 我有类似的事情,但在你们得到回应之前没有机会这样做。但是,我会将 df2 和 df1 更改为 s1 和 s2,因为它们是系列而不是数据帧 +1
    • vaaw 很好的答案:)
    猜你喜欢
    • 2016-12-12
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多