Вопрос или проблема
У меня есть база данных с несколькими заголовками, как так:
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 или задавайте вопросы на форумах стабильного сообщества.