【发布时间】: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_variables和summarizing_data_users函数中做什么(因为它不是很清楚),我们将尝试找到有效的 Pandas 方法来做到这一点...... -
@MaxU 谢谢。请参阅我上面的编辑。
-
简要扩展@MaxU cmets,在这里您实际上只需要显示(1)样本数据,(2)您尝试过的内容,(3)期望的结果。不是一个坏问题,但它可以更简洁一些。 ;-)
-
@JohnE 我试图探索这样一个事实,即这两个功能彼此非常相似,其中一个适用于其中一种情况,而另一种则不起作用。对不起(:-(
标签: python-2.7 pandas