#python #python-3.x #pandas #dataframe
Вопрос:
Я пытаюсь объединить два кадра данных в один, сопоставив столбец (время). У меня есть два кадра данных, как показано ниже.
Фрейм данных 1
Händelse Time Diesel (l)
28 Bränslenivåökning vid stillastående 20210809 779942
55 Bränslenivåökning vid stillastående 20210810 780215
70 Bränslenivåökning vid stillastående 20210811 780448
87 Bränslenivåökning vid stillastående 20210812 780819
106 Bränslenivåökning vid stillastående 20210813 781037
Фрейм данных 2
Time Tankad mängd diesel
0 20Datum x
208 20141124 293.54
212 20141124 295
215 20141125 296.4
218 20141126 286
221 20141126 287.09
Как вы можете видеть, эти два кадра данных имеют одинаковый столбец «время». Я хочу, чтобы эти две даты слились там, где даты идентичны (даты на рисунке-это лишь часть дат, поэтому одинаковых дат нет). Однако в настоящее время у меня есть этот код:
import os
from numpy import empty, percentile
import pandas as pd
from pandas.core.frame import DataFrame
from tkinter import Tk # from tkinter import Tk for Python 3.x
from tkinter.filedialog import askopenfilename
import logging
import sys
import pathlib
from datetime import date, datetime
Tk().withdraw()
filepathname1 = askopenfilename()
filepathname2 = askopenfilename()
print("You have chosen to mix", filepathname1, "and", filepathname2)
pd.set_option("display.max_rows", None, "display.max_columns", 4)
df1 = pd.read_excel(filepathname1, 'CWA107 Event', na_values=['NA'], skiprows=1, usecols="A, B, F")
df2 = pd.read_excel(filepathname2, na_values=['NA'], skiprows=1, usecols=['Tankad mängd diesel', 'Unnamed: 3']
)
df2.rename(columns={'Unnamed: 3': 'Tid'}, inplace=True)
df2
df2.dropna(inplace=True)
for col in df1.columns:
print(col)
for col in df2.columns:
print(col)
df1['Tid'] = pd.to_datetime(df1['Tid']).dt.strftime('%Y%m%d').astype(int)
df1.dropna(inplace=True)
df1filt = df1[(df1['Händelse'] == "Bränslenivåökning vid stillastående")]
print(df1filt)
df2filt = df2[(df2['Tankad mängd diesel'] != pd.NA)]
df2filt['Tid'] = '20' df2filt['Tid'].astype(str)
print(df2filt)
#merged_df = df1filt.merge(df2filt, on='Tid')
#print(merged_df)
print("Antal tankningar:", len(df1filt))
input()
Как вы можете видеть, я попытался объединить два столбца с помощью
#merged_df = df1filt.merge(df2filt, on='Tid')
#print(merged_df)
И когда я запускаю свой код, используя этот код, я получаю ошибку:
ValueError: You are trying to merge on int32 and object columns. If you wish to proceed you should use pd.concat
Я также попытался преобразовать строки в целые числа, которые не работают из-за строки с 20 датами во фрейме данных 2.
Ожидаемый результат:
Händelse Time Diesel (l) Tankad mängd diesel
28 Bränslenivåökning vid stillastående 20210809 779942 153435
55 Bränslenivåökning vid stillastående 20210810 780215 434452
70 Bränslenivåökning vid stillastående 20210811 780448 246346
87 Bränslenivåökning vid stillastående 20210812 780819 974252
106 Bränslenivåökning vid stillastående 20210813 781037 567565
Надеюсь, этой информации достаточно. Заранее благодарю вас!
Ответ №1:
Ну, если проблема связана с нулевой строкой, вы можете просто отбросить ее и попытаться снова объединить (если нет определенной причины, по которой вам нужна эта строка):
df2filt = df2filt.drop(df2filt.index[0])
или
df2filt.drop(df2filt.index[0], inplace=True)
Комментарии:
1. Хм, теперь я, к сожалению, получаю ошибку:
numpy.core._exceptions.UFuncTypeError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U2'), dtype('int32')) -> None
2. После добавления «20» в столбец времени в df2 и преобразования его в строку преобразуйте его в тот же тип, что и df1. Кстати, попробуйте преобразовать оба в «int64», так как просто «int» не является типом данных pandas.
3. Как ты предлагаешь мне договориться? В настоящее время у меня есть этот код:
df2filt.drop(df2filt.index[0], inplace=True) df2filt['Tid'] = '20' df2filt['Tid'].astype(int64) df1 = pd.DataFrame.astype(int64)
4. Попробуйте, может быть, вот так:
df2filt.drop(df2filt.index[0], inplace=True) df2filt['Tid'] = '20' df2filt['Tid'] df2filt['Tid'] = df2filt['Tid'].astype(int64) df1 = pd.to_datetime(df1['Tid']).dt.strftime('%Y%m%d').astype(int64)
затем объединитесь.5. Решена последняя ошибка, но теперь я получил:
TypeError: can only concatenate str (not "int") to str