繁体   English   中英

读取多个文件但对 python 中的一个文件执行摘要的优雅方式

[英]Elegant way to read multiple files but perform summary on one in python

我有多个文件,如下所示。 我的任务是读取所有这些文件,合并它们并创建一个最终的 dataframe。 但是,一个文件 ( Measurement_table_sep_13th.csv ) 必须在用于合并之前进行汇总。 它太大了,所以我们总结它然后合并它。

filenames = sorted(glob.glob('*.csv'))
filenames   # gives the below output

在此处输入图像描述

filenames = sorted(glob.glob('*.csv'))
for f in filenames:
   print(f)
   if f == 'Measurement_table_sep_13th.csv':
       df = spark.read.csv(f, sep=",",inferSchema=True, header=True)
       df = df.groupby("person_id","visit_occurrence_id").pivot("measurement_concept_id").agg(F.mean(F.col("value_as_number")), F.min(F.col("value_as_number")), F.max(F.col("value_as_number")),
                                            F.count(F.col("value_as_number")),F.stddev(F.col("value_as_number")),
                                            F.expr('percentile_approx(value_as_number, 0.25)').alias("25_pc"),
                                            F.expr('percentile_approx(value_as_number, 0.75)').alias("75_pc"))
   else:
       df = spark.read.csv(f, sep=",",inferSchema=True, header=True)

   try:
      JKeys = ['person_id', 'visit_occurrence_id'] if 'visit_occurrence_id' in df.columns else ['person_id']
      print(JKeys)
      df_final = df_final.join(df, on=JKeys, how='left')
      print("success in try")
   except:
      df_final = df
      print("success in except")

如您所见,我在合并之前总结了Measurement_table_sep_13th.csv文件,但是还有其他优雅有效的方法来编写它吗?

如果您不想将一个文件保存在不同的文件夹中,您也可以直接使用 glob 将其排除:

接下来是这篇文章: glob exclude pattern

files = glob.glob('files_path/[!_]*')

您可以使用它为除测量文件之外的所有文件运行 glob function,然后加入它。

那么您可以避免冗长的 if 代码。

它看起来像(随后是这篇文章: 将文件夹的多个 csv 文件加载到一个 dataframe 中):

files = glob.glob("[!M]*.csv")
dfs = [pd.read_csv(f, header=True, sep=";", inferShema=True) for f in files]

df2 = pd.concat(dfs,ignore_index=True)
df = spark.read.csv(f, sep=",",inferSchema=True, header=True)
df = df.groupby("person_id","visit_occurrence_id").pivot("measurement_concept_id").agg(F.mean(F.col("value_as_number")), F.min(F.col("value_as_number")), F.max(F.col("value_as_number")),
                                            F.count(F.col("value_as_number")),F.stddev(F.col("value_as_number")),
                                            F.expr('percentile_approx(value_as_number, 0.25)').alias("25_pc"),
                                            F.expr('percentile_approx(value_as_number, 0.75)').alias("75_pc"))
JKeys = ['person_id', 'visit_occurrence_id'] if 'visit_occurrence_id' in df.columns else ['person_id']
df_final = df(df2, on=JKeys, how='left')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM