在pandas中基于标准创建一个虚拟变量

2024-06-16 07:29:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

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

我怎么能这么做? 注:数据集中可能缺少销售值,我怎么能说忽略这些值呢?你知道吗


Tags: 数据标准date定义公司it国家fr
1条回答
网友
1楼 · 发布于 2024-06-16 07:29:51

使用^{}作为平均值,将它们和groupby与aggregate all进行比较,检查是否所有值都返回True

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

相关问题 更多 >