首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于字符串格式的大熊猫数据过滤

基于字符串格式的大熊猫数据过滤
EN

Stack Overflow用户
提问于 2022-09-27 10:32:51
回答 2查看 39关注 0票数 1

我需要根据日期过滤我的数据,格式为"%d-%m-%Y"。我不知道哪些列符合这个条件,可能有多个列满足这个条件。我如何处理这个问题呢?

代码语言:javascript
复制
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

我的预期产出:

代码语言:javascript
复制
 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()“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-27 11:08:15

如果要获得有效日期,可以尝试转换to_datetime,并且只保留非NA值的行/列:

代码语言:javascript
复制
df2 = df.apply(pd.to_datetime, format='%d/%m/%Y', errors='coerce')

mask = df2.notna()

out = df2.loc[mask.any(axis=1), mask.any()]

产出:

代码语言:javascript
复制
  Training-2 (Realized) Training-4 (Realized)
0            2022-09-05            2022-09-11
票数 0
EN

Stack Overflow用户

发布于 2022-09-27 10:46:44

尝试如下:

代码语言:javascript
复制
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值,但是在另一个行中,则得到如下结果:

代码语言:javascript
复制
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.

  • Now,使用df.stack作为索引/列的pd.Series获取所有值,就像使用Series.str.extract和regex模式来查找所有类似日期的值一样。注:从技术上讲,所使用的模式还将提取类似“40/1/3000”的内容;如果这是一个问题,则使模式更加precise.

  • Finally,--我们使用Series.dropna只保留已提取的值,然后再次使用unstack。使用df.droplevel on column level 0消除0 (即带有提取值的列的“名称”)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73866155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档