【问题标题】:Select rows by minimum absolute difference between dates, by group按日期之间的最小绝对差,按组选择行
【发布时间】:2018-09-13 00:56:35
【问题描述】:
A B C
0 2002-01-16 2002-02-28 Jack
1 2002-01-16 2002-01-30 Helen
2 2002-01-16 2002-02-28 Peter
3 2002-01-16 2002-01-30 Jud
4 2002-04-27 2002-04-30 Nick
5 2002-04-27 2002-05-25 Wendy
6 2002-04-27 2002-04-30 Bryan
7 2002-04-27 2002-05-25 Sarah
我想为每个A 组选择A 日期更接近B 日期的行。
输出应该是:
A B C
1 2002-01-16 2002-01-30 Helen
3 2002-01-16 2002-01-30 Jud
4 2002-04-27 2002-04-30 Nick
6 2002-04-27 2002-04-30 Bryan
【问题讨论】:
标签:
python
pandas
datetime
dataframe
【解决方案1】:
用途:
df = df[df['B'].sub(df['A']).groupby(df['A']).transform(lambda x: x == x.min())]
print (df)
A B C
1 2002-01-16 2002-01-30 Helen
3 2002-01-16 2002-01-30 Jud
4 2002-04-27 2002-04-30 Nick
6 2002-04-27 2002-04-30 Bryan
详情:
print (df['B'].sub(df['A']))
0 43 days
1 14 days
2 43 days
3 14 days
4 3 days
5 28 days
6 3 days
7 28 days
dtype: timedelta64[ns]
print (df['B'].sub(df['A']).groupby(df['A']).transform(lambda x: x == x.min()))
0 False
1 True
2 False
3 True
4 True
5 False
6 True
7 False
dtype: bool
【解决方案2】:
这是一种方式。
# convert columns to datetime
df[['A', 'B']] = df[['A', 'B']].apply(pd.to_datetime)
# calculate absolute difference
df['Diff'] = (df['B'] - df['A']).abs()
# filter for difference equal to mapped minimum
res = df.loc[df['Diff'] == df['A'].map(df.groupby('A')['Diff'].min())]
结果:
A B C Diff
1 2002-01-16 2002-01-30 Helen 14 days
3 2002-01-16 2002-01-30 Jud 14 days
4 2002-04-27 2002-04-30 Nick 3 days
6 2002-04-27 2002-04-30 Bryan 3 days