问题::仅保留一项定义的重复项(日期)。
假设您有这个DataFrame
,且日期重复:
Name Item Date value1 value2
...
1235 Marc A 21-Dec-17 7 1000
1236 Marc H 05-Jan-18 9 2000
1237 Marc Q 27-Jul-18 4 500
1238 John H 14-Dec-17 4 500
1239 John Q 07-Feb-18 6 500
1240 John A 07-Feb-18 8 1000
1241 John H 07-Feb-18 2 1000
1242 John A 05-Dec-21 7 1000
1243 John Q 27-Aug-25 8 500
1244 John H 27-Aug-25 4 700
...
col Item的唯一值为t = ['A', 'H', 'Q']
。按t的重要性排名为:A,Q和最后H。
例如行1239-1241,我只想保留1240行,对于行1243-1244,我只想保留1243。
我很难通过dataframe
进行逐行迭代。而且由于dataframe
很大,我正在寻找一种更快的解决方案。有一种优雅的方法吗?
答案 0 :(得分:4)
使用:
df['Item'] = pd.Categorical(df['Item'], categories= ['H','Q','A'], ordered=True)
df['Date'] = pd.to_datetime(df['Date'])
df = df.sort_values(['Date','Item'], ascending=[True, False]).drop_duplicates('Date')
print (df)
Name Item Date value1 value2
1238 John H 2017-12-14 4 500
1235 Marc A 2017-12-21 7 1000
1236 Marc H 2018-01-05 9 2000
1240 John A 2018-02-07 8 1000
1237 Marc Q 2018-07-27 4 500
1242 John A 2021-12-05 7 1000
1243 John Q 2025-08-27 8 500
说明:
Item
列转换为ordered categoricals to_datetime
转换日期sort_values
前按drop_duplicates
排序如果要通过Name
列检查重复项:
df = df.sort_values(['Name','Item'], ascending=False).drop_duplicates('Name')
print (df)
Name Item Date value1 value2
1236 Marc H 2018-01-05 9 2000
1238 John H 2017-12-14 4 500
通过Name
和Date
s:
df = df.sort_values(['Name','Date','Item'], ascending=False).drop_duplicates(['Name', 'Date'])
print (df)
Name Item Date value1 value2
1237 Marc Q 2018-07-27 4 500
1236 Marc H 2018-01-05 9 2000
1235 Marc A 2017-12-21 7 1000
1244 John H 2025-08-27 4 700
1242 John A 2021-12-05 7 1000
1241 John H 2018-02-07 2 1000
1238 John H 2017-12-14 4 500