我们说我有一些这样的数据:
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
答案 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)