我需要根据日期过滤我的数据,格式为"%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()“。
发布于 2022-09-27 11:08:15
如果要获得有效日期,可以尝试转换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发布于 2022-09-27 10:46:44
尝试如下:
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假设我们还向列Training-3 (Realized)添加了一个date值,但是在另一个行中,则得到如下结果:
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解释
首先,我们使用pd.MultiIndex.
df.stack作为索引/列的pd.Series获取所有值,就像使用Series.str.extract和regex模式来查找所有类似日期的值一样。注:从技术上讲,所使用的模式还将提取类似“40/1/3000”的内容;如果这是一个问题,则使模式更加precise.
Series.dropna只保留已提取的值,然后再次使用unstack。使用df.droplevel on column level 0消除0 (即带有提取值的列的“名称”)。https://stackoverflow.com/questions/73866155
复制相似问题