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