【问题标题】:Pandas: Counting the proportion of zeros in rows and columns of dataframePandas:计算数据框行和列中零的比例
【发布时间】:2016-06-20 03:29:44
【问题描述】:

我在下面有这段代码。令我惊讶的是,它适用于列而不适用于行。

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) 

输出是这样的:

   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']]

我期待用户这样做:

Sumarizing users...
[['1' '0.0']
 ['2' '0.5']
 ['3' '0.0']]

看来问题出在这一行:

dft[dft.isin([0])]

它不会像第一种情况那样将 dft 限制为“真”值。

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

编辑:

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

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

【问题讨论】:

  • 使用循环遍历 DF 的列/行绝对不是使用 Pandas 的最佳方法。只需解释你在 summarizing_data_variablessummarizing_data_users 函数中做什么(因为它不是很清楚),我们将尝试找到有效的 Pandas 方法来做到这一点......
  • @MaxU 谢谢。请参阅我上面的编辑。
  • 简要扩展@MaxU cmets,在这里您实际上只需要显示(1)样本数据,(2)您尝试过的内容,(3)期望的结果。不是一个坏问题,但它可以更简洁一些。 ;-)
  • @JohnE 我试图探索这样一个事实,即这两个功能彼此非常相似,其中一个适用于其中一种情况,而另一种则不起作用。对不起(:-(

标签: python-2.7 pandas


【解决方案1】:

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

df.astype(bool).sum(axis=0)

对于每行中非零的数量使用

df.astype(bool).sum(axis=1)

注意:

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

df.fillna(0).astype(bool).sum(axis=1)
【解决方案2】:

试试这个而不是第一个函数:

print(df[df == 0].count(axis=1)/len(df.columns))

更新(更正):

print('rows')
print(df[df == 0].count(axis=1)/len(df.columns))
print('cols')
print(df[df == 0].count(axis=0)/len(df.index))

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

ID  var1  var2
1     2     3
2     5     0
3     4     5
4    10    10
5    1      0

输出:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2019-01-03
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 2017-07-19
    相关资源
    最近更新 更多