Как мне загрузить базу данных с несколькими неконсистентными заголовками?

Вопрос или проблема

У меня есть база данных с несколькими заголовками, как так:

site_no,datetime,00060_00003    
11481500,2019-10-05,7.54
[...]
site_no,datetime,00010_00001,00010_00002,00010_00003,00060_00003
11523000,2019-10-05,15.0,14.1,14.6,1920

Мне нужно объединить их во что-то похожее на это:

site_no,datetime,00010_00001,00010_00002,00060_00003    
11481500,2019-10-05,-1,-1,7.54,-1
11523000,2019-10-05,15.0,14.1,14.6,1920

Код, который у меня есть для этого:

    df = pd.read_csv(outputFileName, false_values = ["***"], header=headerlist[0] )
    i = 1
    while i+1 < len(headerlist):
        newdf = pd.read_csv(outputFileName, false_values=["***"], skiprows=headerlist[i]-1, header = headerlist[i]).head(n=(headerlist[i+1]-headerlist[i]),)
        df.join(newdf, on = "datetime", how="outer")
        i = i + 1
    df.to_csv(outputFileName)

Я получаю ошибку:

KeyError: 'datetime'

$ cat one.csv
    site_no,datetime,00060_00003
    11481500,2019-10-05,7.54
$ cat two.csv
    site_no,datetime,00010_00001,00010_00002,00010_00003,00060_00003
   11523000,2019-10-05,15.0,14.1,14.6,1920

код:

df2 = pd.read_csv('two.csv')
df = pd.read_csv('one.csv')

pd.concat([df,df2], join='outer', join_axes=[df2.columns])

выход:

   00010_00001  00010_00002  00010_00003  00060_00003  00060_00003        datetime   site_no
0          NaN          NaN          NaN          NaN             7.54  2019-10-05  11481500
0         15.0         14.1         14.6       1920.0              NaN  2019-10-05  11523000

pd.join или pd.concat работает на всей таблице данных, вам не нужно перебрасывать переменные.

используя merge: (из документации)

t = pd.DataFrame({'key':['foo','foo'], 'lval':[1,2]})
>>> right = pd.DataFrame({'key':['foo', 'foo'], 'rval':[4,5]})
>>> left
   key  lval
0  foo     1
1  foo     2
>>> right
   key  rval
0  foo     4
1  foo     5
>>> pd.merge(left, right, on='key')
   key  lval  rval
0  foo     1     4
1  foo     1     5
2  foo     2     4
3  foo     2     5

В этом случае concat то, что вам нужно

Вы можете прочитать данные в таблицу данных, используя обычный pd.read_csv

df1 = pd.read_csv('one.csv')
df2 = pd.read_csv('two.csv')

Затем примените pd.concat с axis=0 и ignore_index=True. Указывая axis=0, вы размещаете df’ы друг над другом. Столбцы, которые не совпадают, будут приводить к NaN. Вы можете использовать fillna(-1), чтобы изменить это на -1 в соответствии с вашим требованием.

df1 = pd.concat([df1,df2], axis=0, ignore_index=True).fillna(-1)

Результат этого будет:

one.csv будет df1:

    site_no    datetime  00060_00003
0  11481500  2019-10-05         7.54

two.csv будет df2:

    site_no    datetime  00010_00001  00010_00002  00010_00003  00060_00003
0  11523000  2019-10-05         15.0         14.1         14.6         1920

объединенная df1 будет:

    site_no    datetime  00060_00003  00010_00001  00010_00002  00010_00003
0  11481500  2019-10-05         7.54         -1.0         -1.0         -1.0
1  11523000  2019-10-05      1920.00         15.0         14.1         14.6

Ответ или решение

Как загрузить базу данных с несколькими несогласованными заголовками

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

Шаг 1: Загрузка данных

Первоначально загружаем оба файла в pandas DataFrame. Это можно сделать с помощью метода pd.read_csv(), который эффективно считывает данные из CSV-файлов.

import pandas as pd

# Загрузка данных из файлов
df1 = pd.read_csv('one.csv')
df2 = pd.read_csv('two.csv')

Шаг 2: Объединение данных

Чтобы объединить оба датафрейма, используем функцию pd.concat(), которая позволяет объединить два или более датафреймов по осям. В нашем случае мы объединим их по вертикали (ось 0).

# Объединение датафреймов
combined_df = pd.concat([df1, df2], axis=0, ignore_index=True)

Устранение несоответствий

При объединении датафреймов, если в одном из них отсутствует какое-либо поле, будет возвращено значение NaN. Нам нужно заменить эти NaN на -1, как вы указали в своем запросе.

# Замена NaN на -1
combined_df.fillna(-1, inplace=True)

Шаг 3: Финальная структура данных

Теперь, когда мы объединили и очистили данные, можно проверить результат:

print(combined_df)

Ожидаемый вывод

При выполнении кода объединение данных должно привести к следующей структуре:

    site_no    datetime  00060_00003  00010_00001  00010_00002  00010_00003
0  11481500  2019-10-05         7.54          -1          -1          -1
1  11523000  2019-10-05          -1         15.0         14.1       14.6

Заключение

Таким образом, используя простые методы библиотеки pandas, мы смогли эффективно объединить данные из нескольких источников с различными заголовками. Этот подход может быть адаптирован для работы с более сложными структурами данных и большим количеством файлов. Ключ к успеху заключается в четком понимании структуры данных и правильном использовании доступных инструментов.

Если вы столкнетесь с другими проблемами или у вас есть вопросы, не стесняйтесь обратиться к документации Pandas или задавайте вопросы на форумах стабильного сообщества.

Оцените материал
Добавить комментарий

Капча загружается...