Объединение кадров данных в виде разных типов dtypes

#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