我有一个df,例如:
number city date
1 Denver_1 2019-01-14
1 Denver_1 2019-01-15
1 Denver_1 2019-01-16
1 Denver_2 2019-03-28
1 Denver_2 2019-03-29
2 Denver_1 2019-05-14
2 Denver_1 2019-05-15
2 Denver_1 2019-05-16
2 Denver_2 2019-01-28
2 Denver_2 2019-01-29
2 Seattle 2019-03-22
2 Seattle 2019-03-22
3 Denver_2 2019-05-28
3 Denver_2 2019-05-29
3 Seattle 2019-03-21
3 Seattle 2019-03-21
我要按数字分组,并选择日期较高的 Denver ,并让 Seattle 这是因为它们不会像 Denver 那样重复。 我想要的结果看起来像:
number city date
1 Denver_2 2019-03-28
1 Denver_2 2019-03-29
2 Denver_1 2019-05-14
2 Denver_1 2019-05-15
2 Denver_1 2019-05-16
2 Seattle 2019-03-22
2 Seattle 2019-03-22
3 Denver_2 2019-05-28
3 Denver_2 2019-05-29
3 Seattle 2019-03-21
3 Seattle 2019-03-21
我尝试过:
df2 = df.groupby(['number']).apply(lambda x: x['city'].unique())
number
1 [Denver_1, Denver_2]
2 [Denver_1, Denver_2, Seattle]
它为我显示了每个数字的不同城市,但是我不知道如何在其上添加最大日期过滤器并将其应用于主要df。
在我的案例中,我看到的其他使用groupby()。filter()的示例将摆脱 Seattle 。
答案 0 :(得分:1)
不幸的是,由于规则不同,我认为您需要分别处理丹佛和西雅图:
加载样本数据:
s = '''number city date
1 Denver_1 2019-01-14
1 Denver_1 2019-01-15
1 Denver_1 2019-01-16
1 Denver_2 2019-03-28
1 Denver_2 2019-03-29
2 Denver_1 2019-05-14
2 Denver_1 2019-05-15
2 Denver_1 2019-05-16
2 Denver_2 2019-01-28
2 Denver_2 2019-01-29
2 Seattle 2019-03-22
2 Seattle 2019-03-22
3 Denver_2 2019-05-28
3 Denver_2 2019-05-29
3 Seattle 2019-03-21
3 Seattle 2019-03-21'''
df = pd.DataFrame.from_csv(io.StringIO(s), sep='\s+')
df['date'] = pd.to_datetime(df['date'])
df =df.reset_index()
解决方案:
selector = lambda x: x.loc[x['city'] == x.loc[x['date'].idxmax(), 'city']]
denvers = df[df['city'].str.contains('Denver')].groupby('number', as_index=False).apply(selector)
seattles = df[df['city'].str.contains('Seattle')]
pd.concat([denvers.reset_index(level=0, drop=True), seattles], axis = 0).sort_index()
输出:
number city date
3 1 Denver_2 2019-03-28
4 1 Denver_2 2019-03-29
5 2 Denver_1 2019-05-14
6 2 Denver_1 2019-05-15
7 2 Denver_1 2019-05-16
10 2 Seattle 2019-03-22
11 2 Seattle 2019-03-22
12 3 Denver_2 2019-05-28
13 3 Denver_2 2019-05-29
14 3 Seattle 2019-03-21
15 3 Seattle 2019-03-21