组内设置值

2024-09-27 02:18:21 发布

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

我试着给熊猫中的每个分组分配一个名称。你知道吗

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

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']

我想把这些名字分配给每个记录,循环式的。所以我创建了一个helper函数来拉长这个列表以匹配长度。你知道吗

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'组。我不想让“马特”和“杰夫”都拥有前两张唱片,只有马特应该拥有它们。我试过.groupby().transform().apply()以及.assign()但都没有成功。我不知道如何先处理我的名单。它应该返回。。你知道吗

    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

Tags: 名称idsdf列表lennamesmatchmatt
3条回答

这是你需要的吗?你知道吗

(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

如果我了解你的问题:

import pandas as pd
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]})

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

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

dg = df.groupby('a')['ids'].apply(tuple).reset_index()
dg['owner'] = match_length(names, len(dg))

rows = []
_ = dg.apply(lambda row: [rows.append([row['a'], nn, row['owner']]) 
                         for nn in row.ids], axis=1)
dg = pd.DataFrame(rows, columns=dg.columns)

print(dg)

所以结果:

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

您可以在所有分组的元素中运行循环。你知道吗

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]})

grouped_df = df.groupby('a')
x = pd.DataFrame()
r = pd.DataFrame()

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

for key, item in grouped_df:
    x = grouped_df.get_group(key).copy()
    x['owner'] = names[(key - 1) % len(names)]
    r = r.append(x)

print(r)

输出:

     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

相关问题 更多 >

    热门问题