根据三列(或更多)

时间:2017-05-22 15:28:49

标签: python excel csv pandas

我需要有关数据集的帮助,如下所示:

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})

现在我有一组字典,其中包含每个地点超过特定值的次数。 这是我需要的信息,一个Spot的情况发生了多少次。 诀窍在哪里? csv文件超过2GB,我需要非常快速地处理它。

1 个答案:

答案 0 :(得分:1)

这是一个使用pandas groupby的解决方案,肯定比循环更有效。

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