簡體   English   中英

Python Pandas 列過濾子字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM