计算pandas中每行的一些值的列数

jov*_*cbg 7 python dataframe pandas

我有这样的数据帧,数据:

Site code    Col1  Col2  Col3
A5252        24    53     NaN
A5636        36    NaN    NaN
A4366        NaN   NaN    NaN
A7578        42    785    24
Run Code Online (Sandbox Code Playgroud)

我想要计算一些具有一定价值的列,但没有NaN.期望的输出:

 Site code   Col1  Col2  Col3  Count
    A5252     24    53     NaN    2
    A5636     36    NaN    NaN    1
    A4366     NaN   NaN    NaN    0
    A7578     42    785    24     3
Run Code Online (Sandbox Code Playgroud)

与此相反的东西:df = data.isnull().sum(axis = 1)

jez*_*ael 9

需要isnull改为notnull:

#if first columns is not index, set it
data = data.set_index('Site code')
data['Count'] = data.notnull().sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

或使用功能DataFrame.count:

data = data.set_index('Site code')
data['Count'] = data.count(axis=1)
print (data)
           Col1   Col2  Col3  Count
Site code                          
A5252      24.0   53.0   NaN      2
A5636      36.0    NaN   NaN      1
A4366       NaN    NaN   NaN      0
A7578      42.0  785.0  24.0      3
Run Code Online (Sandbox Code Playgroud)

选择列的另一种解决方案是loc(Site code是列,不是index):

print (data.loc[:, 'Col1':])
   Col1   Col2  Col3
0  24.0   53.0   NaN
1  36.0    NaN   NaN
2   NaN    NaN   NaN
3  42.0  785.0  24.0

data['Count'] = data.loc[:, 'Col1':].count(axis=1)
print (data)
  Site code  Col1   Col2  Col3  Count
0     A5252  24.0   53.0   NaN      2
1     A5636  36.0    NaN   NaN      1
2     A4366   NaN    NaN   NaN      0
3     A7578  42.0  785.0  24.0      3
Run Code Online (Sandbox Code Playgroud)

Jon Clements的另一个好主意- 使用filter:

data['Count'] = data.filter(regex="^Col").count(axis=1)
print (data)

  Site code  Col1   Col2  Col3  Count
0     A5252  24.0   53.0   NaN      2
1     A5636  36.0    NaN   NaN      1
2     A4366   NaN    NaN   NaN      0
3     A7578  42.0  785.0  24.0      3
Run Code Online (Sandbox Code Playgroud)

  • 或者,在已知列名但顺序不知道的情况下,可以替代上一个示例:`df.filter(regex =“ ^ Col”)` (2认同)