pandas group by with reset index

34gzjxbg  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(125)

如果我有以下pandas数据框
| 用户ID|登录日期|PlacedOrderItems|其他栏目|
| --------------|--------------|--------------|--------------|
| 小行星A123456|2023-04-01 2023-04-01|1|一种|
| 小行星A123456|2023-04-10 2023-04-10 2023-04-10|0|B|
| B123456|2023-04-05 2023-04-05 2023-04-05|0|c|
| B123456|2023-04-06 2023-04-06|二|d|
| B123456|2023-04-07 2023-04-07|0|e|
我想使用group by UserID,并将minLoginDatemaxPlacedOrderItems添加到我的datafarme的每一行。我尝试了Group by,但将列名变成了一个奇怪的多级索引。
但是我想要的是像下面这样的东西,我保留了原始的 Dataframe ,只是添加了两个新的列。
| 用户ID|登录日期|PlacedOrderItems|其他栏目|最小登录日期|最大订购项|
| --------------|--------------|--------------|--------------|--------------|--------------|
| 小行星A123456|2023-04-01 2023-04-01|1|一种|2023-04-01 2023-04-01|1|
| 小行星A123456|2023-04-10 2023-04-10 2023-04-10|0|B|2023-04-01 2023-04-01|1|
| B123456|2023-04-05 2023-04-05 2023-04-05|0|c|2023-04-05 2023-04-05 2023-04-05|二|
| B123456|2023-04-06 2023-04-06|二|d|2023-04-05 2023-04-05 2023-04-05|二|
| B123456|2023-04-07 2023-04-07|1|e|2023-04-05 2023-04-05 2023-04-05|二|

ee7vknir

ee7vknir1#

方法1:转换为聚合和广播值

g = df.groupby('UserID')
df['min_login_date'] = g['LoginDate'].transform('min')
df['max_order_items'] = g['PlacedOrderItems'].transform('max')

方法2:进行命名聚合,然后合并回来

d = {'min_login_date': ('LoginDate', 'min'), 'max_order_items': ('PlacedOrderItems', 'max')}
df = df.merge(df.groupby('UserID').agg(**d))
UserID   LoginDate  PlacedOrderItems Other column min_login_date  max_order_items
0  A123456  2023-04-01                 1            a     2023-04-01                1
1  A123456  2023-04-10                 0            b     2023-04-01                1
2  B123456  2023-04-05                 0            c     2023-04-05                2
3  B123456  2023-04-06                 2            d     2023-04-05                2
4  B123456  2023-04-07                 0            e     2023-04-05                2
ogsagwnx

ogsagwnx2#

你可以通过使用groupby()方法和transform()方法创建两个新列来实现这一点:min_login_date和max_order_items:

import pandas as pd

# set display options
pd.set_option('display.max_columns', 10)
pd.set_option('display.width', 100)

# create the dataframe
data = {'UserID': ['A123456', 'A123456', 'B123456', 'B123456', 'B123456'],
        'LoginDate': ['2023-04-01', '2023-04-10', '2023-04-05', '2023-04-06', '2023-04-07'],
        'PlacedOrderItems': [1, 0, 0, 2, 0],
        'OtherColumn': ['a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data)

# convert LoginDate to datetime format
df['LoginDate'] = pd.to_datetime(df['LoginDate'])

# group by UserID and transform to get the min LoginDate and max PlacedOrderItems
df['min_login_date'] = df.groupby('UserID')['LoginDate'].transform('min')
df['max_order_items'] = df.groupby('UserID')['PlacedOrderItems'].transform('max')

# group by all columns and take the first row of each group
group_cols = ['UserID', 'LoginDate', 'PlacedOrderItems', 'OtherColumn', 'min_login_date', 'max_order_items']
df = df.groupby(group_cols).first().reset_index()

# print the resulting dataframe
print(df.to_string(index=False))

相关问题