Python Pandas:每组最小最大值的比较

时间:2016-01-19 18:14:57

标签: python pandas

我们说我有一些这样的数据:

              timestamp
patient_id
99          10
99          100
3014        20
3014        200

pandas中的每个患者身份的最大,最小和平均时间戳范围究竟如何呢?

我正在寻找的是能够报告这个:

shortest range = 90 (100 - 10)
longest range = 180 (200 - 20)
average range = (180 + 90) / 2 = 135

1 个答案:

答案 0 :(得分:0)

设置

创建虚拟DataFrame:

import pandas as pd

data = '''99          10
99          100
3014        20
3014        200'''.split('\n')

使用两个嵌套列表推导,拆分行,然后拆分列并将所有元素转换为int。然后导入DataFrame

data = [[int(n) for n in item.split()] for item in data]

DF = pd.DataFrame(data, columns=['pid', 'timestamp'])

作为学习练习,循环遍历每个组(假设每个pid的任意数量的时间戳,而不是两个)。这不是解决方案 - 只是为了演示groupby的工作原理:

for pid, grp in DF.groupby('pid'):
    print(pid, grp.timestamp.min(), grp.timestamp.max())

# Prints:
# (99, 10, 100)
# (3014, 20, 200)

解决方案

解决方案更有效:获取分钟和最大值的矢量,提取范围,然后找到范围的最小值,最大值和平均值。 Pandas的优势在于它将作为一个单元在DataFrame的任何列上运行,使得对数组的计算非常简单,如下所示:

mins = DF.groupby('pid').timestamp.min()
maxs = DF.groupby('pid').timestamp.max()
ranges = maxs - mins

shortest_range = ranges.min()
longest_range = ranges.max()
average_range = ranges.mean()

print(shortest_range, longest_range, average_range)

# (90, 180, 135.0)