【问题标题】:Search for treshold values based on key from three columns(or more)根据三列(或更多)的键搜索阈值
【发布时间】:2017-05-22 15:28:48
【问题描述】:

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

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,我需要非常快地处理它。

【问题讨论】:

    标签: python excel csv pandas


    【解决方案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
    

    【讨论】:

    • 编辑了答案,简化了代码。现在应该更干净了。
    • 很好地向我解释了它。非常感谢:)
    • 很高兴它有帮助。如果这解决了您的问题,请投票并接受答案:)
    • 我现在不能投票,当我的声望超过 15 分时我会:)我会在一分钟内测试
    • 好的,我找到了解决方案。高度 = grouped.apply(lambda x: x[x['Height'].isin(range(12,32))].shape[0])。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2021-11-12
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多