Python 将groupby的结果应用于多行
我有一个数据帧df,如下所示: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
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结合使用来创建计算列,以便避免混乱的合并:
我对那些能想出简单解决方案的人感兴趣。有没有一种方法可以在不创建单独的主键数据帧的情况下实现这一点?我对那些能够提出简单解决方案的人感兴趣。有没有一种方法可以在不创建单独的主键数据帧的情况下实现这一点?