首页 > 解决方案 > Python:如何使用列表检查 csv 列中是否没有值

问题描述

我有一个 CSV 文件,我想检查每一行是否在我在列表中指定的不同列中有一个或多个值。如果任何列中没有值,它应该加到一个计数器中,这样我就知道有多少行是空的。但是,如果它在列表中的一列中有一个值,则它不应该做任何事情。

CSV 文件是这样的: .csv 文件

我编写了下面的代码,但它返回 0,这是不正确的。

import pandas as pd

testfile = 'test1.csv'

df = pd.read_csv(testfile)

column_names = ['Uniprot_acc',
'Uniprot_id',
'Interpro_domain',
'Ensembl_geneid',
'Ensembl_transcriptid',
'SIFT_score',
'SIFT_pred']

counter = 0

for row in df:
    for column_name in column_names:
        if column_name in row:
            if column_name == None:
                counter =+ 1

print(counter)

我想知道有多少行不包含任何内容。如果没有值,它应该检查列表中每一列的每一行。如果该行中确实没有任何内容,则应该计算在内。所以在这个例子中它应该是 3。

标签: pythonpython-3.xpandascsvjupyter-notebook

解决方案


利用:

counter = df[column_names].isnull().all(axis=1).sum()
print (counter)

样品

df = pd.DataFrame({
         'A':list('abcdef'),
         'Uniprot_acc':[np.nan,5,4,5,np.nan,4],
         'Uniprot_id':[np.nan,8,9,4,np.nan,np.nan],
         'Interpro_domain':[np.nan,3,np.nan,7,np.nan,0],
         'E':[5,3,np.nan,9,np.nan,4],

})

column_names = ['Uniprot_acc',
                'Uniprot_id',
                'Interpro_domain']

print (df)
   A  Uniprot_acc  Uniprot_id  Interpro_domain    E
0  a          NaN         NaN              NaN  5.0
1  b          5.0         8.0              3.0  3.0
2  c          4.0         9.0              NaN  NaN
3  d          5.0         4.0              7.0  9.0
4  e          NaN         NaN              NaN  NaN
5  f          4.0         NaN              0.0  4.0

counter = df[column_names].isnull().all(axis=1).sum()
print (counter)
2

说明

首先按列表过滤列:

print (df[column_names])
   Uniprot_acc  Uniprot_id  Interpro_domain
0          NaN         NaN              NaN
1          5.0         8.0              3.0
2          4.0         9.0              NaN
3          5.0         4.0              7.0
4          NaN         NaN              NaN
5          4.0         NaN              0.0

然后检查缺失值NoneNaNs:

print (df[column_names].isnull())
   Uniprot_acc  Uniprot_id  Interpro_domain
0         True        True             True
1        False       False            False
2        False       False             True
3        False       False            False
4         True        True             True
5        False        True            False

通过以下方式检查每行是否所有 True DataFrame.all

print (df[column_names].isnull().all(axis=1))
0     True
1    False
2    False
3    False
4     True
5    False
dtype: bool

最后计数仅Trues by sum


推荐阅读