我在下面有一个熊猫df,其中列按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
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
您将获得预期的输出