[英]Python pandas column filtering substring
我在 python3 中有一個使用 Pandas 的數據框,它有一列包含一個帶日期的字符串。
這是列的子集
ColA
"2021-04-03"
"2021-04-08"
"2020-04-12"
"2020-04-08"
"2020-04-12"
我想兩次刪除具有相同月份和日期的行,並保留最新年份的行。
這將是我對這個子集的期望
ColA
"2021-04-03"
"2021-04-08"
"2020-04-12"
刪除了最后兩行,因為 2020-04-12 和 2020-04-08 的日期已經在 2021 年。
我想用 apply 和 lambda 來做這件事,但我的真實數據幀有數百行和數十列,所以效率不高。 有沒有更有效的方法來做到這一點?
有幾種方法可以做到這一點。 其中之一是提取年份,按年份對其進行排序,然后刪除具有重復月日對的行。
# separate year and month-day pairs
df['year'] = df['ColA'].apply(lambda x: x[:4])
df['mo-day'] = df['ColA'].apply(lambda x: x[5:])
df.sort_values('year', inplace=True)
print(df)
這是分離和排序后的樣子:
ColA year mo-day
2 2020-04-12 2020 04-12
3 2020-04-08 2020 04-08
4 2020-04-12 2020 04-12
0 2021-04-03 2021 04-03
1 2021-04-08 2021 04-08
之后,我們可以簡單地刪除重復項並刪除附加列:
# drop duplicate month-day pairs
df.drop_duplicates('mo-day', keep='first', inplace=True)
# get rid of the two columns
df.drop(['year','mo-day'], axis=1, inplace=True)
# since we dropped duplicate, reset the index
df.reset_index(drop=True, inplace=True)
print(df)
最后結果:
ColA
0 2020-04-12
1 2020-04-08
2 2021-04-03
這將比將整個列轉換為日期時間並提取日期要快得多,因為您正在處理字符串。
我不確定您是否可以避免使用“應用”來提取日期的相關部分進行分組,但是如果您首先將該列轉換為熊貓日期時間類型,這會容易得多:
df = pd.DataFrame({'colA':
["2021-04-03",
"2021-04-08",
"2020-04-12",
"2020-04-08",
"2020-04-12"]})
df['colA'] = df.colA.apply(pd.to_datetime)
然后您可以按(日,月)分組並保持最高值,如下所示:
df.groupby(df.colA.apply(lambda x: (x.day, x.month))).max()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.