【问题标题】:Pandas Groupby and sortingPandas Groupby 和排序
【发布时间】:2021-07-15 22:00:05
【问题描述】:

我没有找到在 Pandas 中组织以下数据框以显示我需要的所有信息的方法。 我有以下数据框:


    Fecha   ID  Nombre  Doc Doc2    Prod    Cantidad

0   2021-03-06 00:00:00 1   Lolo    123 1   1564    1
1   2021-03-06 00:00:00 1   Lolo    123 1   15665   1
2   2021-03-06 00:00:00 1   Lolo    123 1   1674    1
3   2021-03-06 00:00:00 2   Momo    125 1   1568    1
4   2021-03-06 00:00:00 2   Momo    125 1   1568    1
5   2021-03-06 00:00:00 3   PePe    136 2   1568    1
6   2021-03-06 00:00:00 3   PePe    136 2   1678    1
7   2021-03-06 00:00:00 4   Lolo    123 1   1674    1
8   2021-03-06 00:00:00 5   Coco    125 2   1568    1
9   2021-03-07 00:00:00 6   Lolo    123 1   15665   1

现在,我需要添加 Cantidad of` `` Prodfor the same date for each person, in example Lolo, she has rows 0, 1, 2 and 4 on the same day. The way I found to do it was withgroupbyafter concatenating theDate + Doc+Doc2``` (所有字符串),这是我发现的唯一方法能够按不同的日期对同一个人进行分组和分隔。代码如下:

df['Concat'] = df['Doc'] + df['Doc2'] + df['Fecha'].str[:-9].str.replace('-','')

gb = df.groupby(['Concat', 'Fecha', 'Nombre', 'Doc', 'Doc2', 'Prod'],
                as_index=False)[['Cantidad']].sum()

我得到了这个结果:

Concat  Fecha   Nombre  Doc Doc2    Prod    Cantidad
0   123120210306    2021-03-06 00:00:00 Lolo    123 1   1564    1
1   123120210306    2021-03-06 00:00:00 Lolo    123 1   1674    2
2   123120210306    2021-03-06 00:00:00 Lolo    123 1   15665   1
3   123120210307    2021-03-07 00:00:00 Lolo    123 1   15665   1
4   125120210306    2021-03-06 00:00:00 Momo    125 1   1568    2
5   125220210306    2021-03-06 00:00:00 Coco    125 2   1568    1
6   136220210306    2021-03-06 00:00:00 PePe    136 2   1568    1
7   136220210306    2021-03-06 00:00:00 PePe    136 2   1678    1

分组是正确的,问题是当我想把```ID```放在数据框中并选择日期的最小ID,在这种情况下对于“Lolo”是1(它有1和示例中的 4 天)。

每次我将ID 放入 groupby 时,它都会停止按数量对我进行分组。

有人可以指导我如何获得解决方案吗?结果应该是这样的:

Concat  Fecha   ID  Nombre  Doc Doc2    Prod    Cantidad
0   123120210306    2021-03-06 00:00:00 1   Lolo    123 1   1564    1
1   123120210306    2021-03-06 00:00:00 1   Lolo    123 1   1674    2
2   123120210306    2021-03-06 00:00:00 1   Lolo    123 1   15665   1
3   123120210307    2021-03-07 00:00:00 6   Lolo    123 1   15665   1
4   125120210306    2021-03-06 00:00:00 2   Momo    125 1   1568    2
5   125220210306    2021-03-06 00:00:00 5   Coco    125 2   1568    1
6   136220210306    2021-03-06 00:00:00 3   PePe    136 2   1568    1
7   136220210306    2021-03-06 00:00:00 3   PePe    136 2   1678    1

谢谢。

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    看起来您想要每个日期的最小 ID,我认为您随后会希望对该日期的每个实例使用该最小 ID。如果是这样,请执行单独的 groupby 以仅获取该数据,然后按日期合并。看这个玩具例子:

    df = pd.DataFrame({'date': ["2021-03-06", "2021-03-06", "2021-03-07", "2021-03-07"], 'ID': [1, 2, 3, 4]})
    
    df_min_id = df.groupby('date', as_index=False)['ID'].min()
    
    # you may want to rename the ID column to flag that it is the min
    df_min_id = df_min_id.rename(columns={'ID': 'min_ID'})
    
    df = df.merge(df_min_id, on='date', how='left')
    # in your case, I think you want:
    gb = gb.merge(df_min_id, on='date', how='left')
    
    print(df)
    #          date  ID  min_ID
    # 0  2021-03-06   1       1
    # 1  2021-03-06   2       1
    # 2  2021-03-07   3       3
    # 3  2021-03-07   4       3
    
    

    【讨论】:

    • 谢谢,看起来它正在使用该示例。我将检查这个巨大的文件,看看它是如何工作的。顺便说一句,我在 df 级别进行了合并,之后,我使用了 groupby
    猜你喜欢
    • 2019-08-16
    • 2017-02-07
    • 2015-01-17
    • 2017-05-10
    • 2018-11-05
    • 2017-06-13
    • 2015-03-06
    • 2018-08-29
    • 2021-08-27
    相关资源
    最近更新 更多