根据三列(或更多)的密钥search阈值

我需要帮助像这样的数据集:

Name1 Name2 Name3 Temp Height Alon Walon Balon 105 34 ] Alon Walon Balon 106 42 | Alon Walon Balon 105 33 ]-- Samples of Spot: Alon-Walon-Balon Alon Walon Kalon 101 11 ] Alon Walon Kalon 102 32 ]-- Samples of Spot: Alon-Walon-Kalon Alon Talon Balon 111 12 ]-- Samples of Spot: Alon-Talon-Balon Alon Talon Calon 121 10 ]-- Samples of Spot: Alon-Talon-Calon 

我想实现什么?

我有空间的一个点的样本,这个点用三个字来描述,在这个例子中,我们来看看Alon-Walon-Balon:我想比较Temp中的每个值到105这个值,如果这个值高于105则保存这到另一列。 身高同样如此。

我现在怎么做?

 df = df.groupby[['Name1','Name2','Name3','Temp','Height']].size().reset_index() visited = () cntSpot = 0 overValTemp = 0 overValHeight = 0 for i in len(df): name1 = str(df.get_value(i,'Name1')) name2 = str(df.get_value(i,'Name2')) name3 = str(df.get_value(i,'Name3')) if str(name1+name2+name3) in visited: cntSpot+=1 if df.get_value(i,'Temp')>105: overValTemp+=1 if df.get_value(i,'Height)<13: overValHeight+=1 a = str(name1+name2+name3) visited.update({a:cntSpot,overValemp,overValHeight}) 

现在我有一套词典,每一个点都有多less次超过一定的数值​​。 这是我需要的信息,一个Spot发生多less次的情况。 诀窍在哪里? csv文件超过2GB,我需要快速处理它。

这是一个解决scheme,使用pandasgroupby,肯定比循环更有效率。

 grouped = df.groupby(('Name1', 'Name2', 'Name3')) count = grouped.size() temp = grouped.apply(lambda x: x[x['Temp']>105].shape[0]) height = grouped.apply(lambda x: x[x['Height']<13].shape[0]) result = pd.concat([count, temp, height], keys = ['Count', 'overValTemp', 'overValHeight'], axis = 1) result.index = map(lambda x: "-".join(x), result.index.tolist()) 

结果如下:

  Count overValTemp overValHeight Alon-Talon-Balon 1 1 1 Alon-Talon-Calon 1 1 1 Alon-Walon-Balon 3 1 0 Alon-Walon-Kalon 2 0 1