我下面有这段代码。对于我来说,它对列而不是对行有效,这使我感到惊讶。
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进行同样的操作,但是我对每一行都这样做。但是,它不起作用。
我最喜欢的获取每列中非零数的方法是
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)
试试这个代替第一个功能:
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)