Конкатные кадры данных: присваивайте уникальные имена столбцам и удаляйте дубликаты - PullRequest
0 голосов
/ 23 октября 2019

Я перебираю ежемесячные данные метеостанции. Я могу объединить файлы следующим образом:

path = r"D:\NOAA\output\TEST" 
all_files = glob.glob(path + "/*.csv")

for filename in all_files:
    print filename # prints D:\NOAA\output\TEST\189501.tave.conus.csv
    df = (pd.read_csv(f) for f in all_files)
    concatenated_df = pd.concat(df, axis=1, join='inner')

Что приводит к следующему кадру данных:

     lat      lon     temp    lat      lon     temp    lat      lon    temp
0  24.5625 -81.8125  21.06  24.5625 -81.8125  17.08  24.5625 -81.8125  22.42
1  24.5625 -81.7708  21.06  24.5625 -81.7708  17.08  24.5625 -81.7708  22.47
2  24.5625 -81.7292  21.06  24.5625 -81.7292  17.08  24.5625 -81.7292  22.47
3  24.5625 -81.6875  21.05  24.5625 -81.6875  17.04  24.5625 -81.6875  22.47
4  24.6042 -81.6458  21.06  24.6042 -81.6458  17.08  24.6042 -81.6458  22.45

Столбцы lat и lon идентичны, поэтому я бы хотелотбросьте эти дубликаты столбцов. Столбцы temp уникальны для каждого ежемесячного файла CSV. Я хочу сохранить все из них, но также дать им значимые имена столбцов, взятые из имени файла, то есть:

        lat      lon   temp185901   temp185902   temp185903
0    24.5625  -81.8125   21.06        17.08        22.42
1    24.5625  -81.7708   21.06        17.08        22.47
2    24.5625  -81.7292   21.06        17.08        22.47
3    24.5625  -81.6875   21.05        17.04        22.47
4    24.6042  -81.6458   21.06        17.08        22.45

Я новичок в Pandas (это кажется потрясающим, но это много для поглощения), Буду признателен за любую помощь. Я думаю, что решения находятся в параметрах, которые я использую для .concat(), .duplicate() и .loc().

Пример данных: ftp: //ftp.commissions.leg.state. mn.us/pub/gis/Temp/NOAA/

Ответы [ 2 ]

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

Вы можете объединить два столбца и установить суффиксы для других:

temp = df1.merge(df2, on=['lat','lon'], suffixes=('185901','185902'))

       lat      lon  temp185901  temp185902
0  24.5625 -81.8125       21.06       17.08
1  24.5625 -81.7708       21.06       17.08
2  24.5625 -81.7292       21.06       17.08
3  24.5625 -81.6875       21.05       17.04
4  24.6042 -81.6458       21.06       17.08

Или в цикле

temp.merge(df3, on=['lat','lon']).rename(columns={'temp':'temp185903'})

       lat      lon  temp185901  temp185902  temp185903
0  24.5625 -81.8125       21.06       17.08       22.42
1  24.5625 -81.7708       21.06       17.08       22.47
2  24.5625 -81.7292       21.06       17.08       22.47
3  24.5625 -81.6875       21.05       17.04       22.47
4  24.6042 -81.6458       21.06       17.08       22.45

df = []
for filename in all_files:
    df1 = pd.read_csv(filename)
    # if the first loop
    if not list(df):
       df = df1
    else:
       df = df.merge(df1, on=['lat','lon'])
    df.rename(columns={'temp':'temp'+put_numer_from_filename}, inplace=True)
0 голосов
/ 23 октября 2019

добавляет новые данные к объединенному фрейму данных в виде новых строк со столбцом «дата», чтобы указать, из какого файла поступили данные. Измените логику, чтобы получить дату из имени файла.

import pandas as pd
import glob

path = r'D:\NOAA\output\TEST'
all_files = glob.glob(path + '/*.csv')

df_concat = pd.DataFrame()

for file in all_files:
    df = pd.read_csv(file)
    df['date'] = file #ammend the variable file to get the date from your file names

    df_concat = df_concat.append(df)
...