Python 将groupby的结果应用于多行

Python 将groupby的结果应用于多行,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个数据帧df,如下所示: PO SO Date Name Qty 0 123 34 2020-01-05 Carl 5 1 111 55 2020-10-10 Beth 7 2 123 12 2020-02-03 Greg 11 3 101 55 2019-12-03 Carl 3 4 123 34 2020-11-30 Beth 24 5 111 55 2019-04-02 Greg

我有一个数据帧df,如下所示:

    PO  SO        Date  Name  Qty
0  123  34  2020-01-05  Carl    5
1  111  55  2020-10-10  Beth    7
2  123  12  2020-02-03  Greg   11
3  101  55  2019-12-03  Carl    3
4  123  34  2020-11-30  Beth   24
5  111  55  2019-04-02  Greg    6
6  202  99  2020-05-06  Beth   19
    PO  SO        Date  Name  Qty
0  123  34  2020-01-05  Carl    5
1  111  55  2019-04-02  Beth    7
2  123  12  2020-02-03  Greg   11
3  101  55  2019-12-03  Carl    3
4  123  34  2020-01-05  Beth   24
5  111  55  2019-04-02  Greg    6
6  202  99  2020-05-06  Beth   19
我想做的是,当按PO等分组时,用数据帧的最小日期替换日期。例如,有两行的PO为“123”,SO为“34”。由于这些行中的最小日期为“2020-01-05”,因此两行的日期列都应设置为“2020-01-05”

因此,结果如下所示:

    PO  SO        Date  Name  Qty
0  123  34  2020-01-05  Carl    5
1  111  55  2020-10-10  Beth    7
2  123  12  2020-02-03  Greg   11
3  101  55  2019-12-03  Carl    3
4  123  34  2020-11-30  Beth   24
5  111  55  2019-04-02  Greg    6
6  202  99  2020-05-06  Beth   19
    PO  SO        Date  Name  Qty
0  123  34  2020-01-05  Carl    5
1  111  55  2019-04-02  Beth    7
2  123  12  2020-02-03  Greg   11
3  101  55  2019-12-03  Carl    3
4  123  34  2020-01-05  Beth   24
5  111  55  2019-04-02  Greg    6
6  202  99  2020-05-06  Beth   19

为了实现这一点,我们将使用PO、SO以及PO和SO的每个组合的最短日期创建一个密钥。我们使用groupby和min来实现这一点

import pandas as pd

df = pd.DataFrame({'PO':  [123, 111, 123, 101, 123, 111, 202], 
                  'SO':   [34, 55, 12, 55, 34, 55, 99], 
                  'Date': ['2020-01-05', '2020-10-10', '2020-02-03', '2019-12-03', '2020-11-30', '2019-04-02', '2020-05-06'], 
                  'Name': ['Carl', 'Beth', 'Greg', 'Carl', 'Beth', 'Greg', 'Beth'], 
                  'Qty':  [5, 7, 11, 3, 24, 6, 19]})

df_grouped = df[['PO', 'SO', 'Date']].groupby(by=['PO', 'SO'], as_index=False, dropna=False).min()

print(df_grouped)

    PO  SO        Date
0  101  55  2019-12-03
1  111  55  2019-04-02
2  123  12  2020-02-03
3  123  34  2020-01-05
4  202  99  2020-05-06
现在,我们可以将其与原始数据框合并,用df_grouped中的Date列替换旧的Date列


为了实现这一点,我们将使用PO、SO以及PO和SO的每个组合的最短日期创建一个密钥。我们使用groupby和min来实现这一点

import pandas as pd

df = pd.DataFrame({'PO':  [123, 111, 123, 101, 123, 111, 202], 
                  'SO':   [34, 55, 12, 55, 34, 55, 99], 
                  'Date': ['2020-01-05', '2020-10-10', '2020-02-03', '2019-12-03', '2020-11-30', '2019-04-02', '2020-05-06'], 
                  'Name': ['Carl', 'Beth', 'Greg', 'Carl', 'Beth', 'Greg', 'Beth'], 
                  'Qty':  [5, 7, 11, 3, 24, 6, 19]})

df_grouped = df[['PO', 'SO', 'Date']].groupby(by=['PO', 'SO'], as_index=False, dropna=False).min()

print(df_grouped)

    PO  SO        Date
0  101  55  2019-12-03
1  111  55  2019-04-02
2  123  12  2020-02-03
3  123  34  2020-01-05
4  202  99  2020-05-06
现在,我们可以将其与原始数据框合并,用df_grouped中的Date列替换旧的Date列

您可以将transform与groupby结合使用来创建计算列,以便避免混乱的合并:

您可以将transform与groupby结合使用来创建计算列,以便避免混乱的合并:


我对那些能想出简单解决方案的人感兴趣。有没有一种方法可以在不创建单独的主键数据帧的情况下实现这一点?我对那些能够提出简单解决方案的人感兴趣。有没有一种方法可以在不创建单独的主键数据帧的情况下实现这一点?