我需要根據日期過濾我的資料框,格式為"%d-%m-%Y"。我不知道哪些列符合此條件,可能有多個列符合此條件。我該如何解決這個問題?
import pandas as pd
df = pd.DataFrame(
{
"Name": ['A', 'B', 'C'],
"Training-1 (Realized)": [0, 0, 0],
"Training-2 (Realized)": ["5/9/2022", "TAKEN", 0],
"Training-3 (Realized)": ["TAKEN", "TAKEN", 0],
"Training-4 (Realized)": ["11/9/2022", 0, 0]
}
)
Name Training-1 (Realized) Training-2 (Realized) Training-3 (Realized) Training-4 (Realized)
0 A 0 5/9/2022 TAKEN 11/9/2022
1 B 0 TAKEN TAKEN 0
2 C 0 0 0 0
我的預期輸出:
Training-2 (Realized) Training-4 (Realized)
0 5/9/2022 11/9/2022
我嘗試使用 .contains() 方法,但它對我不起作用。我不斷收到“ValueError:DataFrame 的真值不明確。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。”
uj5u.com熱心網友回復:
如果要獲取有效日期,可以嘗試轉換to_datetime并僅保留具有非 NA 值的行/列:
df2 = df.apply(pd.to_datetime, format='%d/%m/%Y', errors='coerce')
mask = df2.notna()
out = df2.loc[mask.any(axis=1), mask.any()]
輸出:
Training-2 (Realized) Training-4 (Realized)
0 2022-09-05 2022-09-11
uj5u.com熱心網友回復:
嘗試如下:
out = df.stack().str.extract(r'^(\d{1,2}\/\d{1,2}\/\d{4})$').dropna().unstack().\
droplevel(0, axis=1)
print(out)
Training-2 (Realized) Training-4 (Realized)
0 5/9/2022 11/9/2022
假設我們還向 column 添加了一個日期值Training-3 (Realized),但在不同的行中,那么我們會得到:
df.iloc[2,3] = '12/9/2022'
print(out)
Training-2 (Realized) Training-4 (Realized) Training-3 (Realized)
0 5/9/2022 11/9/2022 NaN
2 NaN NaN 12/9/2022
解釋
- 首先,我們使用索引/列作為
df.stack來獲取所有值。pd.Seriespd.MultiIndex - 現在,使用
Series.str.extract正則運算式模式來查找所有看起來像日期的值。NB 從技術上講,使用的模式也會提取“40/1/3000”之類的內容;如果這是一個問題,使模式更精確。 - 最后,我們使用
Series.dropna僅保留已提取的值,然后unstack再次使用。使用df.dropleveloncolumn level 0去掉0(即提取值的列的“名稱”)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/510278.html
