Wie füge ich eine neue Spalte hinzu, ohne Warnung?

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
10211291
User
Beiträge: 25
Registriert: Montag 8. Juli 2019, 10:51
Wohnort: Berlin

Ich möchte eine Spalte zu einem Datensatz hinzufügen ('column1' und 'column2').
Soweit ich verstanden habe, sollte ich Option 1 wählen, aber egal welche Option ich versuche, ich bekomme die Warnung "SettingWithCopyWarning".

Ich möchte
1) csv lesen
2) Daten filtern und gefilterte Daten in eine neue Variable schreiben
3) Spalte mit konstantem Wert zu neuer Variable hinzufügen
4) ... später: einen Vionlin-Plot aus den Daten erstellen

Wo liegt mein Fehler?

Code:

Code: Alles auswählen

import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from matplotlib import pyplot as plt
import seaborn as sns 


data_1 = pd.read_csv('minimal_data_1.csv', delimiter= ';', decimal=',', usecols=[0,1],skiprows=[0])

data_1_1 = pd.DataFrame() 
data_1_1['Time'] = pd.to_datetime(data_1['Zeitpunkt']) 
data_1_1['0,5 µm'] = data_1['0,5 µm (ft³) [Prt./ft³]'] 

data_1_2 = pd.DataFrame() 
data_1_2  = data_1_1.loc[(data_1_1['Time']>'2021-04-05 10:10:00') & (data_1_1['Time']<'2021-04-05 10:14:00')]

#option1:
data_1_2.loc[:,'column1'] = '0.45'

#option2:
data_1_2['column2'] = '0.45'
print(data_1_2.head())

Warning:

C:\...\Python\Python37\site-packages\pandas\core\indexing.py:845: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/s ... sus-a-copy
self.obj[key] = _infer_fill_value(value)
C:\...\Python\Python37\site-packages\pandas\core\indexing.py:966: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
minimal_data_1.csv:
__________________________________
"Gerät:";"Title"
"Zeitpunkt";"0,5 µm (ft³) [Prt./ft³]";
04.05.2021 10:07:53;22672
04.05.2021 10:08:55;21512
04.05.2021 10:09:57;20972
04.05.2021 10:10:59;1918
04.05.2021 10:12:01;690
04.05.2021 10:13:03;588
04.05.2021 10:14:05;574
04.05.2021 10:15:07;351
__________________________________
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Umwandeln der Datetime-Spalte solltest Du mit der passenden Option schon bei read_csv machen.
Dass Du in data_1_2 einen neuen Dataframe erstellst ist unsinnig, weil Du in der nächsten Zeile diesen Dataframe wegwirfst und statt dessen einen Slice auf data_1_1 erstellst. Daher auch der Fehler. Am einfachsten wäre, die Columns für die ganzen data_1_1 zu erstellen und erst beim Darstellen zu slicen.
data_1, data_1_1 und data_1_2 sind allesamt schlechte Namen und unterscheiden sich nur durch kryptische Zahlen. Wenn Du statt der Zahlen nicht sinnvolle Namen vergeben kannst, ist das ein Zeichen dafür, dass Du vielleicht gar keine 3 Dataframes brauchst, sondern alles mit einem machen kannst.
10211291
User
Beiträge: 25
Registriert: Montag 8. Juli 2019, 10:51
Wohnort: Berlin

Danke schön für den Input, ich werde das erst mal einarbeiten und ausprobieren. Die Namensgebung habe ich hier im Minimalbeispiel wohl zu weit reduziert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Es gibt mit pandas viele Wege zum Ziel und ich kenne auch nur einige wenige mir geläufige. Bei Deinem Beispiel genügt zunächst ein DataFrame:

Code: Alles auswählen

import pandas as pd

df = pd.read_csv('minimal_data_1.csv', delimiter= ';', decimal=',', usecols=[0,1],skiprows=[0])
df = df.rename(columns={'Zeitpunkt': 'time', '0,5 µm (ft³) [Prt./ft³]': '0,5 µm'})
df.insert(2, 'column 1', 0.45)  # weitere Spalte hinzufügen
Wie Sirius3 schreibt lässt sich bereits beim Einlesen schon im Detail eingreifen. So hätte auch ich bspw. die Zeiten mit einem Converter direkt in datetime-Objekte umgewandelt.

Die Bezeichnung der zweiten Spalte ist schlecht: dort sollte stehen um was es sich handelt, sowie die Dimension. Die Bezeichnung besteht aber nur aus der Dimension.
Antworten