熊猫groupby和列中每个值的出现百分比

Naveen Kumar

我有一个像这样的pandas数据框,想创建一个像这样的列created_column

       iv_1  iv_2  iv_3  iv_4  iv_5  col2rplc  created_column
0       0      0     0     0     0      a          0
333     0      0     0     0     0      b          0
      ......
222     1      2     3     4     5      aa         1
324     1      2     3     4     5      cc         1
      ......
1234    1      0     0     0     1      a          1
1235    0      2     0     4     0      a          0
1236    0      0     3     0     0      a          0
1237    0      0     1     0     0      b          0
1238    0      2     0     2     0      b          0
1239    3      0     0     0     3      b          1

说明:
我想创建一个在行中具有1的列,其中该iv_5中的值出现的时间少于或等于数据的40%,这将用于具有值1、3和5的行,如上面的示例所示。我该怎么做呢?

第二个问题:
在创建其他列时,如何也包括小于x%和大于y%的内容,类似于上面的列创建。

耶斯列尔

使用GroupBy.transform除以的长度,DtaFrame并测试Series.le小于或等于:

df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).le(0.4).view('i1')
print (df)
      iv_1  iv_2  iv_3  iv_4  iv_5 col2rplc  created_column
0        0     0     0     0     0        a               0
333      0     0     0     0     0        b               0
222      1     2     3     4     5       aa               1
324      1     2     3     4     5       cc               1
1234     1     0     0     0     1        a               1
1235     0     2     0     4     0        a               0
1236     0     0     3     0     0        a               0
1237     0     0     1     0     0        b               0
1238     0     2     0     2     0        b               0
1239     3     0     0     0     3        b               1

要么:

s = df['iv_5'].value_counts(normalize=True)
idx = s.index[s <= 0.4]

df['created_column'] = df['iv_5'].isin(idx).view('i1')

如果需要Series.between,无论是默认包容性,这意味着>=<=><使用参数inclusive=False

df['created_column'] = df.groupby('iv_5')['iv_5'].transform('size').div(len(df)).between(0.2, 0.5).view('i1')
print (df)

      iv_1  iv_2  iv_3  iv_4  iv_5 col2rplc  created_column
0        0     0     0     0     0        a               0
333      0     0     0     0     0        b               0
222      1     2     3     4     5       aa               1
324      1     2     3     4     5       cc               1
1234     1     0     0     0     1        a               0
1235     0     2     0     4     0        a               0
1236     0     0     3     0     0        a               0
1237     0     0     1     0     0        b               0
1238     0     2     0     2     0        b               0
1239     3     0     0     0     3        b               0

如果需要不能使用诸如><=之间的组合,则可以选择以下方法:

s1 = df.groupby('iv_5')['iv_5'].transform('size').div(len(df))
df['created_column'] = ((s1 > 0.2) & (s1 <= 0.6)).view('i1')

print (df)
      iv_1  iv_2  iv_3  iv_4  iv_5 col2rplc  created_column
0        0     0     0     0     0        a               1
333      0     0     0     0     0        b               1
222      1     2     3     4     5       aa               0
324      1     2     3     4     5       cc               0
1234     1     0     0     0     1        a               0
1235     0     2     0     4     0        a               1
1236     0     0     3     0     0        a               1
1237     0     0     1     0     0        b               1
1238     0     2     0     2     0        b               1
1239     3     0     0     0     3        b               0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章