我有下面的DataFrame
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的值和以下列表:
[2, 4, 6, 8, 10, 16, 18, 21, 23]此列表表示应在数小时后进行分组。例如,在新的列category中,对于那些在2和4之间的values,它给出1;否则,对于6和8之间的小时,它给出0;对于小时,它给出2,其中值是1,否则,如果是0,依此类推。我尝试了以下几种方法:
df.groupby(["values", "hours"])我不能站出来说出来。
预期的结果如下所示:

发布于 2021-02-05 18:02:18
已更新以回答问题。您必须创建单独的查询(如下所示)。这应该适用于特定的范围
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发布于 2021-02-05 18:19:39
你的问题有问题,所以我将假设Epsi95所评论的内容。因此,您可以尝试如下所示:
当你的列表大小相等时,这将会起作用。您也可以为您的案例修改此设置。
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))编辑:
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:
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 5https://stackoverflow.com/questions/66060998
复制相似问题