熊猫:计算数据框的行和列中零的比例

Dan*_*Man 6 python-2.7 pandas

我下面有这段代码。对于我来说,它对列而不是对行有效,这使我感到惊讶。

import pandas as pd

def summarizing_data_variables(df):
    numberRows=size(df['ID'])
    numberColumns=size(df.columns)
    summaryVariables=np.empty([numberColumns,2], dtype =  np.dtype('a50'))    
    cont=-1    
    for column in df.columns:
        cont=cont+1
        summaryVariables[cont][0]=column
        summaryVariables[cont][1]=size(df[df[column].isin([0])][column])/(1.0*numberRows)
    print summaryVariables

def summarizing_data_users(fileName):
    print "Sumarizing users..."   
    numberRows=size(df['ID'])
    numberColumns=size(df.columns)      
    summaryVariables=np.empty([numberRows,2], dtype =  np.dtype('a50'))    
    cont=-1

    for row in df['ID']:
        cont=cont+1
        summaryVariables[cont][0]=row
        dft=df[df['ID']==row]
        proportionZeros=(size(dft[dft.isin([0])])-1)/(1.0*(numberColumns-1)) # THe -1 is used to not count the ID column
        summaryVariables[cont][1]=proportionZeros
    print summaryVariables


if __name__ == '__main__':

    df = pd.DataFrame([[1, 2, 3], [2, 5, 0.0],[3,4,5]])
    df.columns=['ID','var1','var2']
    print df

    summarizing_data_variables(df)
    summarizing_data_users(df) 
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

   ID  var1  var2
0   1     2     3
1   2     5     0
2   3     4     5
[['ID' '0.0']
 ['var1' '0.0']
 ['var2' '0.333333333333']]
Sumarizing users...
[['1' '1.0']
 ['2' '1.0']
 ['3' '1.0']]
Run Code Online (Sandbox Code Playgroud)

我期望用户:

Sumarizing users...
[['1' '0.0']
 ['2' '0.5']
 ['3' '0.0']]
Run Code Online (Sandbox Code Playgroud)

看来问题出在这一行:

dft [dft.isin([0])]

它不像第一种情况那样将dft约束为“ True”值。

你能帮我吗?(1)如何更正用户(ROWS)部分(上面的第二个功能)?(2)这是最有效的方法吗?[我的数据库很大]

编辑:

在函数summarizing_data_variables(df)中,我尝试评估每一列中零的比例。在上面的示例中,变量Id不为零(因此比例为零),变量var1不为零(因此比例也为零),变量var2在第二行中为零(因此比例为1) / 3)。我将这些值保存在2D numpy.array中,其中第一列是数据框的列的标签,第二列是评估的比例。

我想对函数summarizing_data_users进行同样的操作,但是我对每一行都这样做。但是,它不起作用。

Kev*_*hou 7

我最喜欢的获取每列中非零数的方法是

df.astype(bool).sum(axis=0)
Run Code Online (Sandbox Code Playgroud)

对于每行中的非零数,请使用

df.astype(bool).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)

注意:

如果你的 df 中有 nans,你应该首先将它们设为 0,否则它们将被计为 1。

df.fillna(0).astype(bool).sum(axis=1)
Run Code Online (Sandbox Code Playgroud)


Max*_*axU 6

试试这个代替第一个功能:

print(df[df == 0].count(axis=1)/len(df.columns))
Run Code Online (Sandbox Code Playgroud)

更新(更正):

print('rows')
print(df[df == 0].count(axis=1)/len(df.columns))
print('cols')
print(df[df == 0].count(axis=0)/len(df.index))
Run Code Online (Sandbox Code Playgroud)

输入数据(我决定添加几行):

ID  var1  var2
1     2     3
2     5     0
3     4     5
4    10    10
5    1      0
Run Code Online (Sandbox Code Playgroud)

输出:

rows
ID
1    0.0
2    0.5
3    0.0
4    0.0
5    0.5
dtype: float64
cols
var1    0.0
var2    0.4
dtype: float64
Run Code Online (Sandbox Code Playgroud)