使用列列表和多个条件进行索引

2024-09-26 17:59:08 发布

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

尝试获取某些列为零而其他列不为零的列。你知道吗

import pandas as pd
import numpy as np
df=pd.DataFrame({'t':[0,0,0,np.nan],'t2':[0,0,2,3],'t3':[1,0,0,np.nan],'t4':[0,np.nan,2,3]})
zero=['t','t3']
nozero=['t2','t4']

数据帧:

     t  t2   t3   t4
0  0.0   0  1.0  0.0
1  0.0   0  0.0  NaN
2  0.0   2  0.0  2.0
3  NaN   3  NaN  3.0

我试过:

df[((df[zero]==0).any(axis=1))&((df[nozero]!=0).any(axis=1))]

这给了

     t  t2   t3   t4
1  0.0   0  0.0  NaN
2  0.0   2  0.0  2.0

也尝试过:

df[((df[zero]==0)&(df[nozero]!=0)).any(axis=1)]

它给出了一个空的数据帧。你知道吗

期望值:

     t  t2   t3   t4
2  0.0   2  0.0  2.0

任何帮助都会很好。谢谢。你知道吗

编辑澄清:

我需要两个条件(ALL)都为真(zero==0和nozero!=0),但如果行中有任何一对为真,则我需要该行。你知道吗

例如,从以下数据帧:

df = pd.DataFrame({'t': [0, 0, 11,0], 't2': [0, 0, 0, 0], 'z3': [0, 0, 12, 0], 't4': [0, 0, 2, 0],
                   't5': [0, 0, 0, 0], 'z6': [0, 0, 4, 0], 't7': [1, 1, 0, 1], 't8': [1, 1, 0, 1],
                   'z9': [1, 1, 0, 1], 't10': [1, 1, 0, 1], 't11': [1, 1, 0, 1], 'z12': [1, 1, 0, 1]})

nozero=['z3','z6','z9','z12']
zero=list(set(df.columns)-set(nozero))

    t  t2  z3  t4  t5  z6  t7  t8  z9  t10  t11  z12
0   0   0   0   0   0   0   1   1   1    1    1    1
1   0   0   0   0   0   0   1   1   1    1    1    1
2  11   0  12   2   0   4   0   0   0    0    0    0
3   0   0   0   0   0   0   1   1   1    1    1    1

我只想要第2行,因为任意(t,t2)是零,而z3不是零。你知道吗

编辑澄清:

下面的代码生成我想要保留的行(index=2)。有没有比这更有效的方法使用任何或全部?(因为这需要追加行、分配内存、循环等)

import pandas as pd

    df = pd.DataFrame({'t': [0, 0, 11,0], 't2': [0, 0, 0, 0], 'z3': [0, 0, 12, 0], 't4': [0, 0, 2, 0],
                       't5': [0, 0, 0, 0], 'z6': [0, 0, 4, 0], 't7': [1, 1, 0, 1], 't8': [1, 1, 0, 1],
                       'z9': [1, 1, 0, 1], 't10': [1, 1, 0, 1], 't11': [1, 1, 0, 1], 'z12': [1, 1, 0, 1]})
    nozero=['z3','z6','z9','z12']
    zero1=['t','t4','t7','t10']
    zero2=['t2','t5','t8','t11']
    for x,y,z in zip(zero1, zero2, nozero):
        print(df[((df[x]==0) | (df[y]==0)) & (df[z]!=0)])

Tags: dfnpnanpdt3zeroz3t2
3条回答

由于无法使用.any或.all获得所需的行,我编写了一个变通代码。如果你能找到任何更有效的方法而不在列中循环,请告诉我。感谢所有的帮助@Ananay Mital,@m42op64,@coldspeed。你知道吗

import pandas as pd

df = pd.DataFrame({'t': [0, 0, 11,0], 't2': [0, 0, 0, 0], 'z3': [0, 0, 12, 0], 't4': [0, 0, 2, 0],
                   't5': [0, 0, 0, 0], 'z6': [0, 0, 4, 0], 't7': [1, 1, 0, 1], 't8': [1, 1, 0, 1],
                   'z9': [1, 1, 0, 1], 't10': [1, 1, 0, 1], 't11': [1, 1, 0, 1], 'z12': [1, 1, 0, 1]})
nozero=['z3','z6','z9','z12']
zero1=['t','t4','t7','t10']
zero2=['t2','t5','t8','t11']
indices=set()
for x,y,z in zip(zero1, zero2, nozero):
    i=df[((df[x]==0) | (df[y]==0)) & (df[z]!=0)].index.values
    indices.update(i)
print(df.loc[list(indices)])

输出

    t  t2  z3  t4  t5  z6  t7  t8  z9  t10  t11  z12
2  11   0  12   2   0   4   0   0   0    0    0    0

根据您与@coldspeed的讨论,您使用的数据帧看起来更像

     t   t2   t3   t4
0  0.0  0.0  1.0  0.0
1  0.0  0.0  0.0  NaN
2  0.0  2.0  0.0  2.0
3  NaN  3.0  NaN  3.0
4  0.0  1.0  0.0  0.0

在转换了@coldspeed suggered这样的数据类型之后,您可以继续使用它来选择所需的数据。你知道吗

In [193]: df[((df[zero] == 0).all(1) & (df[nozero] != 0).any(1))]
Out[193]: 
     t   t2   t3   t4
1  0.0  0.0  0.0  NaN
2  0.0  2.0  0.0  2.0
4  0.0  1.0  0.0  0.0

第一个条件(df[zero]==0).all(1)查找zero列中0all(1)告诉pandas按列减少)的所有值。第二个条件在nozero列中找到任何不为零的值,正如@Ananay所说,这些值包括NaN。你知道吗

就像@Ananay在他们的回答中所说的,您可以通过使用dropna()删除带有NaN值的行,这样最终的结果就是

In [194]: df[((df[zero] == 0).all(1) & (df[nozero] != 0).any(1))].dropna()
Out[194]: 
     t   t2   t3   t4
2  0.0  2.0  0.0  2.0
4  0.0  1.0  0.0  0.0

我还建议阅读更多关于^{}^{}方法的内容。你知道吗

编辑

我能做到

df[((df['t']==0) | (df['t2']==0)) & (df['z3']!=0)]

但我不知道你想不想说得那么具体。问题只是为我以前的方法找到正确的布尔条件。我们希望第3行返回True,其他行返回False。您可以尝试将此问题重命名为“布尔索引以根据列列表的条件查找值”或搜索该问题。你知道吗

我想是因为南。NaN != 0 is True

df[((df[zero]==0).any(axis=1))&((df[nozero]!=0).any(axis=1))].dropna()

df[((df[zero]==0).any(axis=1))&((df[nozero]!=0).any(axis=1))&(df[zero+nozero].notnull().all(axis=1))]

      t  t2   t3  t4
2   0.0   2  0.0   2




df

     t  t10 t11 t2  t4  t5  t7  t8  z12 z3  z6  z9
0    0    1   1  0   0   0   1   1    1  0   0   1 
1    0    0   0  0   0   0   0   0    1 12   4   1
2   11    1   0  0   2   0   1   0    0  0   0   0
3    0    1   1  0   0   0   1   1    1  0   0   1

df[((df[zero]==0).all(1))&((df[nozero]!=0).all(1))&(df[zero+nozero].notnull().all(1))]

    t t10 t11  t2  t4  t5  t7  t8 z12   z3  z6  z9
1   0   0   0   0   0   0   0   0   1   12   4   1

相关问题 更多 >

    热门问题