Python 大熊猫乐园中的度假村价值观

Python 大熊猫乐园中的度假村价值观,python,pandas,sorting,dataframe,Python,Pandas,Sorting,Dataframe,我正在尝试重新分配或使用列中的值 对于下面的代码,我希望重新分配[Person]列。具体地说,如果任何人的唯一值少于3个,我希望将它们组合起来。如果人员具有3个唯一值,则保持原样 例如: Person 1, A Person 1, B Person 2, C Person 1, D Person 2, E Person 3, F 使用上述示例,Person 1将被单独放置,因为它们具有3个唯一值,而Person 3将与Person 2分组,因为它们分别具有2和1 以下是我到目前为止的情况: d

我正在尝试重新分配或使用
列中的值

对于下面的代码,我希望重新分配
[Person]
列。具体地说,如果任何
的唯一值少于
3个
,我希望将它们组合起来。如果
人员
具有
3个唯一值
,则保持原样

例如:

Person 1, A
Person 1, B
Person 2, C
Person 1, D
Person 2, E
Person 3, F
使用上述示例,
Person 1
将被单独放置,因为它们具有
3个唯一值
,而
Person 3
将与
Person 2
分组,因为它们分别具有2和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'],                 
   'Place' : ['House 1','House 2','House 1','House 3','House 4','House 5','House 1','House 1'],                 
    'Area' : ['X','X','Y','X','X','X','X','X'],    
    'Person' : ['Person 1','Person 1','Person 2','Person 1','Person 3','Person 3','Person 1','Person 1'],                               
 })    

df = pd.DataFrame(data=d)

n = 3
df['complete'] = df.Person.apply(lambda x: 1 if df.Person.tolist().count(x) == n else 0)
df['num'] = df.Person.str.replace('Person ','')
df.sort_values(by=['num','complete'],ascending=True,inplace=True) 

c = 0
person_numbers = []
for x in range(0,999): 
    if x % n == 0:
        c += 1        
    person_numbers.append(c) 

df['Person_new'] = person_numbers[0:len(df)] 
df.Person = 'Person ' + df.Person_new.astype(str) 
df.drop(['complete','Person_new','num'],axis=1,inplace=True)

df['Time'] = pd.to_timedelta(df['Time'])
df = df.sort_values(by='Time')
输出:

      Time    Place Area    Person
0 08:03:00  House 1    X  Person 1
1 08:17:00  House 2    X  Person 1
2 08:20:00  House 1    Y  Person 2
3 10:15:00  House 3    X  Person 1
4 10:15:00  House 4    X  Person 3
5 11:48:00  House 5    X  Person 3
6 12:00:00  House 1    X  Person 2
7 12:10:00  House 1    X  Person 2
这无法识别
索引6-7中重复的
。它们与
索引0
相同。因此,
Person 1
应该分配到这里。代码无法识别重复的值。如果我删除这些重复的
代码可以工作,但我的实际数据集包含大量重复的
可以实现预期的结果:

预期产出:

       Time    Place Area    Person
0   8:03:00  House 1    X  Person 1
1   8:17:00  House 2    X  Person 1
2   8:20:00  House 1    Y  Person 2
3  10:15:00  House 3    X  Person 1
4  10:15:00  House 4    X  Person 2
5  11:48:00  House 5    X  Person 2
6  12:00:00  House 1    X  Person 1
7  12:10:00  House 1    X  Person 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'],
   'Place' : ['House 1','House 2','House 1','House 3','House 4','House 5','House 1','House 1'],
    'Area' : ['X','X','Y','X','X','X','X','X'],
    'Person' : ['Person 1','Person 1','Person 2','Person 1','Person 3','Person 3','Person 1','Person 1'],
 })

df = pd.DataFrame(data=d)

grouper = df.groupby(['Person','Area','Place'])

new_df = pd.DataFrame()

for index, group in grouper:
    # do what you want to group here
    if len(group.index) >= 2:
        # reassign to person 1?
        group['Person'] = 'Person 1'
    # append to new_df
    new_df = new_df.append(group)

你能解释得更清楚一点吗“具体地说,如果任何人的唯一值少于3个,我想把它们组合起来。如果一个人有3个唯一值,就按原样离开。”?@cosmic_inquiry提供了一个例子。这有意义吗?