我正在尝试为熊猫中的每个分组分配一个名称。

我有一个数据框和一个名称列表:

df = pd.DataFrame({'a':[1, 1, 2, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10],
                   'ids':[234, 345, 456, 444, 333, 22, 11, 5, 1, 2, 3, 4, 6]})


names = ['Matt', 'Jeff', 'Steph', 'Shannon']


我想将这些名称分配给每个记录以循环方式进行。因此,我创建了一个辅助函数来拉长此列表以匹配长度。

def match_length(list_, length):
    return length//len(list_)*list_+list_[:length%len(list_)]

df['owner'] = match_length(names, len(df))

    a  ids    owner
    1  234     Matt
    1  345     Jeff
    2  456    Steph
    2  444  Shannon
    3  333     Matt
    4   22     Jeff
    5   11    Steph
    6    5  Shannon
    7    1     Matt
    7    2     Jeff
    8    3    Steph
    9    4  Shannon
   10    6     Matt


我遇到的问题是我想确保将同一个人分配给每个'a'组。我不希望'Matt'和“ Jeff”都拥有前两个记录,只有Matt应该拥有它们。我不确定如何首先处理我的列表,它应该返回。

    a  ids    owner
    1  234     Matt
    1  345     Matt
    2  456     Jeff
    2  444     Jeff
    3  333    Steph
    4   22  Shannon
    5   11     Matt
    6    5     Jeff
    7    1    Steph
    7    2    Steph
    8    3  Shannon
    9    4     Matt
   10    6     Jeff

最佳答案

这是您需要的吗?

(df.groupby('a').ngroup()%4).map(dict(enumerate(names)))
Out[339]:
0        Matt
1        Matt
2        Jeff
3        Jeff
4       Steph
5     Shannon
6        Matt
7        Jeff
8       Steph
9       Steph
10    Shannon
11       Matt
12       Jeff
dtype: object

09-25 15:13