Элегантный способ прочитать несколько файлов, но выполнить сводку по одному в Python - PullRequest
1 голос
/ 23 октября 2019

У меня есть несколько файлов, как показано ниже. Моя задача - прочитать все эти файлы, объединить их и создать один окончательный кадр данных. Однако один файл (Measurement_table_sep_13th.csv) необходимо суммировать перед использованием для слияния. Он слишком велик, поэтому мы суммируем его, а затем объединяем.

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

enter image description here

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 файл до слияния, но есть ли другой элегантный и эффективный способ написать это?

1 Ответ

1 голос
/ 23 октября 2019

Если вы не хотите сохранять один файл в другой папке, вы также можете исключить его напрямую с помощью glob:

, за которым следует следующее сообщение: шаблон исключения глобуса

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

Вы можете использовать это, чтобы запустить функцию glob для всех файлов, кроме файла измерений, а затем присоединиться к ней.

, тогда вы можете избежать длинного if-кода.

Это выглядело бы так (после этого сообщения: Загрузка нескольких файлов CSV из папки в один фрейм данных ):

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...