重新分配按时间分组的数据中的值

2024-06-16 21:39:39 发布

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

我在下面有一个示例,其中列按Value排序。所以-1总是第一位,然后是0,然后是1,然后是2等等

我想根据每个整数的最大计数数重新分配Value个整数。具体来说,我想保持-1不变。对于所有其他数字,我希望0是每个Period的最具代表性的数字。然后将所有其他整数设为1

因此,如果0对于唯一的Period具有最多的整数,那么就可以了。如果另一个整数的计数较高,则将这些值重新指定为0,并将0's交换为1

如果我们把-1单独留下,Period 1有两个0's,两个1's,两个2's。因此,将2's更改为1

Period 2有两个0's和两个1's所以按原样离开

d = {'Item': ["Red", "Blue", "Green", "White", "Black", "Orange", "Yellow", "Brown", "Red", "Blue", "Green", "White", "Black", "Orange", "Yellow", "Brown"],
     'Value': [-1, -1, 0, 0, 1, 1, 2, 2, -1, -1, -1, -1, 0, 0, 1, 1],
     'Period': [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2],
    }

df = pd.DataFrame(data=d)

df['edge']=df.groupby('Period')['Value'].transform(lambda x:x.value_counts().diff().fillna(0).eq(0).all())
df['newval']=df.groupby('Period')['Value'].transform(lambda x:x.value_counts().idxmax())
m1=(df['newval'].ne(0) & df['newval'].eq(df['Value'])) & df['edge'].eq(False)
m2=(df['newval'].ne(0) & df['Value'].eq(0)) & df['edge'].eq(False)
df.loc[m1,'Value']=0
df.loc[m2,'Value']=1
df=df.drop(['newval','edge'],1)

df:

      Item  Value  Period
0      Red     -1       1
1     Blue     -1       1
2    Green      0       1
3    White      0       1
4    Black      1       1
5   Orange      1       1
6   Yellow      2       1
7    Brown      2       1
8      Red     -1       2
9     Blue     -1       2
10   Green     -1       2
11   White     -1       2
12   Black      0       2
13  Orange      0       2
14  Yellow      1       2
15   Brown      1       2

预期产出:

      Item  Value  Period
0      Red     -1       1
1     Blue     -1       1
2    Green      0       1
3    White      0       1
4    Black      1       1
5   Orange      1       1
6   Yellow      1       1
7    Brown      1       1
8      Red     -1       2
9     Blue     -1       2
10   Green      0       2
11   White      0       2
12   Black      1       2
13  Orange      1       2
14  Yellow      1       2
15   Brown      1       2

Tags: dfvalue整数greenblueredperiodeq
1条回答
网友
1楼 · 发布于 2024-06-16 21:39:39

IIUC:

尝试:

df['edge']=df.groupby('Period')['Value'].transform(lambda x:x.value_counts().diff().fillna(0).eq(0).all())
df['newval']=df.groupby('Period')['Value'].transform(lambda x:x[x.ge(0)].value_counts().idxmax())
m1=(df['newval'].ne(0) & df['newval'].eq(df['Value'])) & df['edge'].eq(False)
m2=(df['newval'].ne(0) & df['Value'].eq(0)) & df['edge'].eq(False)
df.loc[m1,'Value']=0
df.loc[m2,'Value']=1
df=df.drop(['newval','edge'],1)

现在,如果您打印df,您将获得预期的输出

相关问题 更多 >