如何通过滚动统计更快地使用熊猫计算组?

时间:2019-10-08 17:37:10

标签: pandas

我有一个巨大的数据框,用于存储有关患者遭遇的信息以及与他们的生命力和实验室测试有关的变量。

str_df.shape
(278546, 34)
str_df.columns
Index(['hadm_id', 'ce_charttime', 'hr', 'sbp', 'dbp', 'map', 'resp', 'temp',
       'spo2', 'glucose', 'base_excess', 'hco3', 'fio2', 'ph', 'paco2', 'sao2',
       'ast', 'bun', 'alp', 'calcium', 'chloride', 'creatinine',
       'bilirubin_direct', 'bilirubin_total', 'lactic_acid', 'magnesium',
       'potassium', 'troponin', 'hematocrit', 'hemoglobin', 'ptt', 'wbc',
       'fibrinogen', 'platelets'],
      dtype='object')

我想计算24小时内每次遇到的患者(hadm_id)的变化统计信息。请注意,在许多情况下,大多数情况下,许多变量具有NaN的意义上,该数据集非常稀疏。

我想出了这段代码,该代码已经在很小的数据子集上进行了测试,并且似乎可以正常工作:

def percentile(n):
  def percentile_(x):
    return x.quantile(n)
  percentile_.__name__ = f'percentile_{n*100:2.0f}'
  return percentile_

def get_stats(df, var_cols, statistics):
  df.set_index('ce_charttime', inplace=True) # change index to charttime to use '24h' on rolling
  stats_dfs = []

  # loop through each var for which change statistics needs to be computed
  for var in var_cols:
    stats_df = df.groupby('hadm_id')[var].rolling('24h').agg(statistics).reset_index(drop=True) # compute stats
    stats_df.columns = [f'{var}_{col}' for col in stats_df.columns] # create var dependent names for stats
    stats_df = pd.concat([df[var].reset_index(drop=True), stats_df], axis=1) # cat the original var value to preserve order 
    stats_dfs.append(stats_df) # add the stats for this parituclar var to the list

  df.reset_index(inplace=True) # remove charttime index
  df.drop(var_cols, inplace=True, axis=1) # drop the original var cols (we've added it in the for loop)
  return pd.concat([df, *stats_dfs], axis=1) # cat the list into a df
statistics = ['min', 'mean', 'median', 'std', 'var', 'kurt', 'skew', percentile(0.25), percentile(0.75), stats.iqr, 'max']
var_cols = str_df.columns[2:]

str_df = get_stats(str_df.copy(), var_cols, statistics)

# reorder columns
move = ['hadm_id', 'ce_charttime']
order = move + (str_df.columns.drop(move).tolist())
str_df = str_df[order]

不幸的是,当我尝试在整个数据集上运行它时,它花费的时间太长,并使Jupyter笔记本崩溃。我想知道是否是因为我正在使用for循环。有更多的pythonic / pandas类型的方法可以完成此任务吗?

谢谢。

0 个答案:

没有答案