如何在不指定中间DF的情况下,通过布尔级数为多个连续回合生成子集?

2024-05-19 16:35:52 发布

您现在位置:Python中文网/ 问答频道 /正文

通常我需要使用布尔标准(例如,df[~df.filterColumn1.duplicated()])过滤或子集数据帧,但有时如果不将中间DF分配给临时对象(或不重复代码),我就无法进一步过滤它

假设我想输出列与子字符串匹配的行,但该列中的某些行为null^{<如果列中的任何值为NaN(或空白),cd2>}将抛出错误(注意:我不一定要解决这个问题!当我需要一个临时DF时,我只是用它作为一个例子。)

因此,在这里,我需要首先为DF编制索引,以确定此列中没有空值的位置,然后为筛选出的DF编制索引,以确定“comments”列的子字符串匹配为True的行

下面是一个DF来举例说明这一点:

df = pd.DataFrame({'modSeq': {0: 'DC[+57]QNLKLIPQRGVS[-2]EAVE', 1: 'DGALQPPFQEPIVGRE', 2: 'DIAPR[-43]AK', 3: 'DQLALI[+16]WFAYLE', 4: 'DQLALIWFAYLE', 5: 'EC[+57]YGL[+16]KLIPE', 6: 'EDC[+57]QNLK', 7: 'EDC[+57]QNLKLIPQR'}, 'area': {0: 551, 1: 8374246, 2: 416840, 3: 546654, 4: 293998, 5: 189995, 6: 59548, 7: 26552}, 'comments': {0: 'weird, both jump around', 1: 'unmodified', 2: nan, 3: 'both go up! Problems recalculating; 190122', 4: 'unmodified', 5: nan, 6: 'unmodified', 7: 'unmodified; Problems recalculating; 190122'}})
                        modSeq     area                                    comments
0  DC[+57]QNLKLIPQRGVS[-2]EAVE      551                     weird, both jump around
1             DGALQPPFQEPIVGRE  8374246                                  unmodified
2                 DIAPR[-43]AK   416840                                         NaN
3            DQLALI[+16]WFAYLE   546654  both go up! Problems recalculating; 190122
4                 DQLALIWFAYLE   293998                                  unmodified
5         EC[+57]YGL[+16]KLIPE   189995                                         NaN
6                 EDC[+57]QNLK    59548                                  unmodified
7            EDC[+57]QNLKLIPQR    26552  unmodified; Problems recalculating; 190122
tempDF = df[~df.comments.isna()]
tempDF[tempDF.comments.str.contains('190122')]

这给了我我想要的正确结果:

              modSeq    area                                    comments
3  DQLALI[+16]WFAYLE  546654  both go up! Problems recalculating; 190122
7  EDC[+57]QNLKLIPQR   26552  unmodified; Problems recalculating; 190122

但是,为了正确索引第二个布尔序列,我必须指定一个临时DF

我怎么能在一个命令中完成这样的任务


Tags: godfareacommentsedcproblemsupboth
1条回答
网友
1楼 · 发布于 2024-05-19 16:35:52

在这种特定的情况下,如果问题是nan将字符串访问器弄乱,那么解决方案可以很简单-将nan替换为空字符串:

df[df.comments.fillna('').str.contains('190122')]

一般来说,虽然我自己不喜欢中间变量,但我所关心的问题更具装饰性。如果您想要避免中间变量名的原因是它不美观,method chaining可能是您想要的(如果有其他问题,请让我知道)。在这种特殊情况下,它会更加丑陋,但通常会导致两步代码

(
    df
    .query("~comments.isna()", engine='python')
    .query("comments.str.contains('190122')", engine='python')
)

相关问题 更多 >