通常我需要使用布尔标准(例如,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
我怎么能在一个命令中完成这样的任务
在这种特定的情况下,如果问题是
nan
将字符串访问器弄乱,那么解决方案可以很简单-将nan
替换为空字符串:df[df.comments.fillna('').str.contains('190122')]
一般来说,虽然我自己不喜欢中间变量,但我所关心的问题更具装饰性。如果您想要避免中间变量名的原因是它不美观,method chaining可能是您想要的(如果有其他问题,请让我知道)。在这种特殊情况下,它会更加丑陋,但通常会导致两步代码
相关问题 更多 >
编程相关推荐