首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groupby和lists类别

Groupby和lists类别
EN

Stack Overflow用户
提问于 2021-02-05 17:47:23
回答 2查看 73关注 0票数 1

我有下面的DataFrame

代码语言:javascript
复制
import pandas as pd

data = {"hours": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
"values": [0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1]}
df = pd.DataFrame(data)

我一直在尝试向df添加一个额外的列,包括groupby values的值和以下列表:

代码语言:javascript
复制
[2, 4, 6, 8, 10, 16, 18, 21, 23]

此列表表示应在数小时后进行分组。例如,在新的列category中,对于那些在2和4之间的values,它给出1;否则,对于6和8之间的小时,它给出0;对于小时,它给出2,其中值是1,否则,如果是0,依此类推。我尝试了以下几种方法:

代码语言:javascript
复制
df.groupby(["values", "hours"])

我不能站出来说出来。

预期的结果如下所示:

EN

回答 2

Stack Overflow用户

发布于 2021-02-05 18:02:18

已更新以回答问题。您必须创建单独的查询(如下所示)。这应该适用于特定的范围

代码语言:javascript
复制
df['category'] = 0
df.loc[(df['hours'] >= 2) & (df['hours'] <= 4), 'category'] = df['values']
df.loc[(df['hours'] >= 6) & (df['hours'] <= 8), 'category'] = df['values'] * 2
df.loc[df['hours'] == 10, 'category'] = df['values'] * 3
df.loc[(df['hours'] >= 16) & (df['hours'] <= 18), 'category'] = df['values'] * 4
df.loc[(df['hours'] >= 21) & (df['hours'] <= 23), 'category'] = df['values'] * 5
票数 1
EN

Stack Overflow用户

发布于 2021-02-05 18:19:39

你的问题有问题,所以我将假设Epsi95所评论的内容。因此,您可以尝试如下所示:

当你的列表大小相等时,这将会起作用。您也可以为您的案例修改此设置。

代码语言:javascript
复制
df['category']=0
x = list(zip(bins[::2], bins[1::2]))
rng = { range(i[0], i[1]+1):idx+1 for idx,i in enumerate(x)}
df.loc[df['values'].eq(1), 'category'] = df.loc[df['values'].eq(1), 'hours'].apply(lambda x: next((v for k, v in rng.items() if x in k), 0))

编辑:

代码语言:javascript
复制
df['category']=0

bins = [(2, 4), (6, 8), (10), (16, 18), (21, 23)]

rng = {}
for idx,i in enumerate(bins, start=1):
    if not isinstance(i, int):
        rng[range(i[0],i[1]+1)]=idx
    else:
        rng[i] = idx


def func(val):
    print(val)
    for k, v in rng.items():
        if isinstance(k, int):
            if val==k:
                return v
        else:
            if val in k:
                return v
        
df.loc[df['values'].eq(1), 'category'] = df.loc[df['values'].eq(1), 'hours'].apply(func)

df:

代码语言:javascript
复制
    hours   values  category
0   1   0   0
1   2   1   1
2   3   1   1
3   4   1   1
4   5   0   0
5   6   1   2
6   7   0   0
7   8   1   2
8   9   0   0
9   10  1   3
10  11  0   0
11  12  0   0
12  13  0   0
13  14  0   0
14  15  0   0
15  16  1   4
16  17  1   4
17  18  1   4
18  19  0   0
19  20  0   0
20  21  1   5
21  22  0   0
22  23  1   5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66060998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档