【问题标题】:generating dummy variables for n largest values in Pandas为 Pandas 中的 n 个最大值生成虚拟变量
【发布时间】:2018-08-18 03:22:18
【问题描述】:

我有一个这样构建的数据库:

>>> df = pd.DataFrame({'id':[1,1,1,2,2,2,2,3,4],'value':[1,2,3,1,2,3,4,1,1]})

>>> df

    id  value    
0   1      1    
1   1      2    
2   1      3    
3   2      1    
4   2      2    
5   2      3    
6   2      4    
7   3      1    
8   4      1

并且我想为每个 ID 的第 n 个最大值(此处为 n=2)生成一个虚拟变量,以便所有第 n 个最大值之一的值都等于 1:

    id  value  Largest 
0   1      1     0    
1   1      2     1    
2   1      3     1    
3   2      1     0    
4   2      2     0    
5   2      3     1    
6   2      4     1    
7   3      1     1    
8   4      1     1

我试过了:

df['highest'] = 0
df['highest'].loc[df['value'].isin(df.groupby(['id'])['value'].nlargest(1))] = 1

但如果一个 ID 恰好是另一个 ID 中的最高值,那会错误分配另一个 ID 中的值

【问题讨论】:

  • 您的问题是什么?你试过什么?什么没有奏效?请包括您的代码和完整的错误消息(如果有)。
  • 我想说,与其创建一个虚拟变量,不如应用一个函数并将 n 设置为它的参数。

标签: python pandas dummy-variable


【解决方案1】:

设置

df = pd.DataFrame({'id':[1,1,1,2,2,2,2,3,4],'value':[1,2,3,1,2,3,4,1,1]})
n = 2

使用nlargestloc

df['flag'] = 0
df.loc[df.groupby('id').value.nlargest(n).index.get_level_values(1), 'flag'] = 1

使用np.whereassign

这避免了就地修改 DataFrame。

df.assign(
    flag=np.where(
        df.index.isin(df.groupby('id').value.nlargest(n).index.get_level_values(1)), 1, 0
    )
)

两者都导致:

   id  value  flag
0   1      1     0
1   1      2     1
2   1      3     1
3   2      1     0
4   2      2     0
5   2      3     1
6   2      4     1
7   3      1     1
8   4      1     1

正如@jezrael 指出的那样,np.where 在这里并不是必需的,因为您正在寻找二进制结果,您可以改为使用:

df.assign(flag=df.index.isin(df.groupby('id').value.nlargest(n).index.get_level_values(1)).astype(int))

【讨论】:

  • 更好的是df.index.isin(df.groupby('id').value.nlargest(n).index.get_level_values(1)).astype(int) ;)
  • @jezrael,很有帮助。如果我尝试用条件标记 nlargest 怎么办?即我想标记 1 如果值
猜你喜欢
  • 2017-05-05
  • 2012-08-10
  • 2018-05-28
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
相关资源
最近更新 更多