Pandas应用函数 - 将每一行与整列进行比较

时间:2015-12-04 01:11:03

标签: python pandas group-by apply

第一次发帖;抱歉格式化错误。我试图计算给定类别中我(更大)数据帧中的所有记录,这些记录在该类别中的其他记录的设定时间内。

groupby函数有意义,但我在定义适当的apply函数时遇到问题。我见过使用多列作为函数输入的示例,有些使用axis=1查看单个行,但没有看到使用整列(查找匹配项)和条目的说明对于有问题的行(确定时间范围)。

我还研究了使用pd.TimeGrouper按类别和时间对记录进行分组,但这可能会遗漏边缘情况。

最后,按类别划分可能会使每个组足够小以直接迭代,但我想学习Pythonic方法,如果可能的话。

示例代码:

data = [{'xfrm':'a', 'time':10}, 
        {'xfrm':'a', 'time':12}, 
        {'xfrm':'a', 'time':20},
        {'xfrm':'b', 'time':7}, 
        {'xfrm':'b', 'time':8}, 
        {'xfrm':'b', 'time':15},
        {'xfrm':'c', 'time':2}, 
        {'xfrm':'c', 'time':8}, 
        {'xfrm':'c', 'time':15}]
df = pd.DataFrame(data)
print df 

对于每条记录,在一段时间内(例如2秒)计算同一变压器的所有记录

answerData = [{'xfrm':'a', 'time':10, 'num':2}, 
        {'xfrm':'a', 'time':12, 'num':2}, 
        {'xfrm':'a', 'time':20, 'num':1},
        {'xfrm':'b', 'time':7, 'num':2}, 
        {'xfrm':'b', 'time':8, 'num':2}, 
        {'xfrm':'b', 'time':15, 'num':1},
        {'xfrm':'c', 'time':2, 'num':1}, 
        {'xfrm':'c', 'time':8, 'num':1}, 
        {'xfrm':'c', 'time':15, 'num':1}]
answerDF = pd.DataFrame(answerData)
print answerDF


# Grouping works fine
gb = df.groupby('xfrm')
for name, group in gb:
    print name
    print group

编辑:我认为这些内容可能有用,但我不确定引用时间列替换“XXXXXX”的适当方法应该是什么。

def getMatches(x, potentials):
    """Applied to the group of restores attributed to meters associated with a particular transformer. 
    Checks each to see how many in the total set are within the time window. """
    matches = 0
    for time in potentials:
        if abs(timedelta(x - time).seconds) < 1200:
                matches += 1
    return matches

detailRestoreDF.groupby('category')['timestamp'].apply(getMatches,args=(XXXXXX,))

1 个答案:

答案 0 :(得分:0)

不太好但是提供了所需的输出:

   time xfrm  num
0    10    a    2
1    12    a    2
2    20    a    1
3     7    b    2
4     8    b    2
5    15    b    1
6     2    c    1
7     8    c    1
8    15    c    1

输出:

apply

不确定我是否理解你要找的东西。但您可以访问>>> gb.apply(lambda x: len(x[x.time < 12])) xfrm a 1 b 2 c 2 dtype: int64 函数中的列。例如,这会计算组内有多少行的次数小于12:

6 < time < 12

或在开放范围>>> gb.apply(lambda x: len(x[(6 < x.time) & (x.time < 12)])) xfrm a 1 b 2 c 1 dtype: int64

{{1}}