我有一个脚本,它根据中的两个列分配一个值。下面的代码能够实现第一步,但我正在努力实现第二步
因此,脚本最初应该:
1) 为[区域]中的每个字符串和[位置]
2) 查看以少于3个唯一值重新分配人员
示例。下面的df在[区域]和[位置]中有6个唯一值。但是分配了3个人。理想情况下,2人们将2个唯一的值每个值
d=({
‘时间’:[‘8:03:00’、‘8:17:00’、‘8:20:00’、‘10:15:00’、‘10:15:00’、‘11:48:00’、‘12:00:00’、‘12:10:00’],
‘地点’:[‘1号楼’、‘2号楼’、‘1号楼’、‘3号楼’、‘4号楼’、‘5号楼’、‘1号楼’、‘1号楼’],
'面积':['X'、'X'、'Y'、'X'、'X'、'X'、'X'、'X'、'X'],
})
df=pd.DataFrame(数据=d)
def g(全球定位系统):
s=gps['Place'].unique()
d=dict(zip(s,np.arange(len(s))//3+1))
gps['Person']=gps['Place'].地图(d)
返回gps
df=df.groupby('Area',sort=False).应用(g)
s=df['Person'].aType(str)+df['Area']
df['Person']=pd.Series(pd.factorize[0]+1).map(str.radd('Person'))
输出:
时间地点区域人员
0 8:03:00房屋1 X人1
18:17:00住宅2 X人1
2 8:20:00房子1 Y人2
3 10:15:00房屋3 X人1
4 10:15:00房子4 X人3
5 11:48:00房子5 X人3
6 12:00:00房子1 X人1
7 12:10:00房子1 X人1
正如您所看到的,第一步很好。或者[区域]中的每个字符串,将[位置]中的第一个3个唯一值分配给一个人。这使得Person 1具有3个值,Person 2具有1个值,Person 3具有2个值
第二步是我挣扎的地方
如果一个人分配给他们的唯一值少于3个,请更改此设置,使每个人最多有3个唯一值
预期产出:
时间地点区域人员
0 8:03:00房屋1 X人1
18:17:00住宅2 X人1
2 8:20:00房子1 Y人2
3 10:15:00房屋3 X人1
4 10:15:00房子4 X人2
5 11:48:00房子5 X人2
6 12:00:00房子1 X人1
7 12:10:00房子1 X人1
当前尝试
在以下内容中,我在代码的最后几行之前添加了几行:
d=({'Time':['8:03:00','8:17:00','8:20:00','10:15:00','10:15:00','11:48:00','12:00:00','12:10:00'],
“地点”:[“1号楼”、“2号楼”、“1号楼”、“3号楼”、“4号楼”、“5号楼”、“1号楼”、“1号楼],
'区域':['X','X','Y','X','X','X','X','X']})
df=pd.DataFrame(数据=d)
def g(全球定位系统):
s=gps['Place'].unique()
d=dict(zip(s,np.arange(len(s))//3+1))
gps['Person']=gps['Place'].地图(d)
返回gps
df=df.groupby('Area',sort=False).应用(g)
s=df['Person'].aType(str)+df['Area']
#添加行
t=s.值_计数()
df_sub=df.loc[s[s.isin(t[t<;3].index)].index].copy()
df_sub[“标记”]=df_sub[“位置”]+df_sub[“区域”]
tags=list(df_sub.tag.unique())
f=lambda x:f'R{int(tags.index(x)/3)+1}'
df_sub['reassign']=df_sub.tag.apply(f)
s[s.isin(t[t<;3].索引)]=df_sub['reassign']
df['Person']=pd.Series(pd.factorize[0]+1).map(str.radd('Person'))
老实说,我不是很确定它在所有情况下都能工作,但它在测试用例中提供了您想要的输出
以前的尝试
让我们看看我是否能够帮助您有限地了解您正在尝试做的事情
您有连续的数据(我称之为事件),并且希望为每个事件分配一个“个人”标识符。您将在每个连续事件上分配的标识符取决于以前的分配,在我看来,它需要按照以下规则进行管理,以便按顺序应用:
-
我知道你:我可以重用以前的标识符,如果:给定标识符的“地点”和“面积”已经出现相同的值(与此有关吗?)
-
我不认识您:如果出现新的Area值,我将创建一个新的标识符(那么Place和Area扮演不同的角色?)
-
我认识你吗?:如果:一个标识符未分配给至少三个事件,我可能会重用以前使用的标识符(如果多个标识符出现这种情况会怎么样?我假设我使用的是最旧的…)
-
不,我不:如果前面的规则都不适用,我将创建一个新的标识符
假设上述情况,以下是解决方案的实施:
#记录分配给每个人的过去事件列表。密钥是个人标识符
人
#df的新列(作为列表),它将附加在dataframe的末尾
人员=名单()
#首先我们定义规则
我认识你(现在的人们):
def状况(现在、过去):
如果(now.Place==e.Place)和(now.Area==e.Area),则返回[e表示过去的e]
i_do=[人对人,过去在人中。items()如果条件(现在,过去)]
如果我这样做:
返回i_do[0]
返回错误
我不认识你(现在的人们):
条件=非布尔值([e代表过去的人。如果e.Area==now.Area,则e代表过去的值())
如果条件:
返回f'Person{len(people)+1}'
返回错误
我认识你吗(人们,现在):
i_do=[人对人,过去在人中。items()如果len(过去)<;3]
如果我这样做:
返回i_do[0]
返回错误
#然后对序列数据进行处理
对于df.itertuples()中的事件:
打印('事件:',事件)
对于[我知道你,我不知道你,我知道你]on 规则:
人员=规则(人员、事件)
打印('\t',规则。\姓名\人员)
如有人:
打破
如果不是个人:
person=f'person{len(people)+1}'
打印('\t',“不,我不”,person)
如果人在人中:
人员[person]。追加(事件)
其他:
人[人]=[事件]
persons.append(person)
df['Person']=人
输出:
事件:熊猫(索引=0,时间=8:00:00',地点=House 1',区域=X',人=Person 1')
我知道你是假的
我不认识你这个人
活动:熊猫(索引=1,时间=8:30:00,地点=2,区域=X,人=1)
我知道你是假的
我不知道你是假的
我认识你吗
活动:熊猫(索引=2,时间=9:00:00,地点=1,区域=Y,人=2)
我知道你是假的
我不认识你这个人
活动:熊猫(索引=3,时间=9:30:00,地点=3,区域=X,人=1)
我知道你是假的
我不知道你是假的
我认识你吗
活动:熊猫(索引=4,时间=10:00:00',地点=4号,区域=X',人=2')
我知道你是假的
我不知道你是假的
我认识你吗
活动:熊猫(指数=5,时间=10:30:00,地点=5,区域=X,人=2)
我知道你是假的
我不知道你是假的
我认识你吗
活动:熊猫(指数=6,时间=11:00:00,地点=1,区域=X,人=1)
我认识你1个人
活动:熊猫(指数=7,时间=11:30:00,地点=6,区域=X,人=3)
我知道你是假的
我不知道你是假的
我知道你是假的吗
不,我不喜欢第三个人
活动:熊猫(指数=8,时间=12:00:00,地点=7号,面积=X,人=3人)
我知道你是假的
我不知道你是假的
我认识你吗
活动:熊猫(指数=9,时间=12:30:00,地点=8,区域=X,人=3)
我知道你是假的
我不知道你是假的
我认识你吗
最后一个数据帧是,如您所愿:
时间地点区域人员
0 8:00:00房屋1 X人1
1 8:30:00住宅2 X人1
2 9:00:00房子1 Y人2
3 9:30:00房屋3 X人1
4 10:00:00房子4 X人2
5 10:30:00房子5 X人2
6 11:00:00房子1 X人1
7 11:30:00房子6 X人3
8 12:00:00房子7 X人3
9 12:30:00住宅8 X人3
备注:注意,我有意避免使用按操作分组和按顺序处理数据。我认为这种复杂性(并且不真正理解您想要做什么…)需要这种方法。此外,您还可以使用上述相同的结构调整规则,使其更为复杂(时间是否真的起作用?)
新数据的最新答案
查看新数据时,我显然不明白您要做什么(特别是,赋值似乎不遵循顺序规则)。
我会有一个解决方案,可以在你的第二个数据集上工作,但它会为第一个数据集提供不同的结果
解决方案简单得多,将添加一列(如果需要,您可以稍后删除该列):
df[“tag”]=df[“Place”]+df[“Area”]
tags=list(df.tag.unique())
f=lambdax:f'Person{int(tags.index(x)/3)+1}'
df['Person']=df.tag.apply(f)
在第二个数据集上,它将给出:
时间地点区域标记人员
0 8:00:00房屋1 X房屋1人1
1 8:30:00住房2 X住房2人1
2 9:00:00住房3 X住房3人1
3 9:30:00房屋1 Y房屋1 Y人2
4 10:00:00房子1 Z房子1 Z人2
5 10:30:00房子1 V房子1 V人2
<