2017-05-23 3 views
2

Ich bin ein Neuling und ich bin mir sicher, es gibt eine einfache Möglichkeit, dies zu tun, die ich nicht kenne, vielen Dank im Voraus für Ihre Hilfe.Pandas Überprüfen, ob Spaltenwert im Bereich zwischen anderen Spaltenwerten

Ich habe die historischen Min- und Max-Verkaufszahlen für die höchsten und niedrigsten Sales-Team Performer an jedem Tag des Jahres für die letzten 10 Jahre. Ich habe das gleiche für 2016 (Beispieldaten unten).

   hist_min hist_max 2016_min 2016_max 
Day_of_Year 
1    1000 10000   898  9000 
2    234  896   300  1000 
3    1254 23666  1000 24000 
4    930 78999  1000  1050 
5    278 74588   300  5000 

Das Endziel ist es, diese Daten in matplotlib zu entwerfen, aber ich möchte nur die vales von der 2016_min Säule erhalten, die unter dem Wert in der hist_min ist, und nur in ähnlicher Weise Werte für die 2016_max Spalten, die mehr sind als die Spalte hist_max. Die Daten würden wie folgt aussehen:

   hist_min hist_max 2016_min 2016_max 
Day_of_Year 
1    1000 10000   898  NULL 
2    234  896  NULL  1000 
3    1254 23666  1000 24000 
4    930 78999  NULL  NULL 
5    278 74588  NULL  NULL 

ich dort ‚NULL‘ gesetzt in die leeren Werte darzustellen, Nan könnte besser sein, aber ich weiß nicht, ob matplot lib können Zahlen ‚Nan‘ handhaben oder nicht .. Das ist der nächste Schritt, also werde ich es bald herausfinden.

Vielen Dank im Voraus für Ihre Hilfe, Me

Antwort

1

Verwenden mask mit boolean Masken, die NaN, NULL oder None wenn True s zurück:

print (df['2016_min'] > df['hist_min']) 
Day_of_Year 
1 False 
2  True 
3 False 
4  True 
5  True 
dtype: bool 

df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min']) 
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max']) 
print (df) 
      hist_min hist_max 2016_min 2016_max 
Day_of_Year           
1    1000  10000  898.0  NaN 
2     234  896  NaN 1000.0 
3    1254  23666 1000.0 24000.0 
4     930  78999  NaN  NaN 
5     278  74588  NaN  NaN 

df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min'], 'NULL') 
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max'], 'NULL') 
print (df) 
      hist_min hist_max 2016_min 2016_max 
Day_of_Year          
1    1000  10000  898  NULL 
2     234  896  NULL  1000 
3    1254  23666  1000 24000 
4     930  78999  NULL  NULL 
5     278  74588  NULL  NULL 

df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min'], None) 
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max'], None) 
print (df) 
      hist_min hist_max 2016_min 2016_max 
Day_of_Year          
1    1000  10000  898  None 
2     234  896  None  1000 
3    1254  23666  1000 24000 
4     930  78999  None  None 
5     278  74588  None  None 
1

Sie können durch eine Bedingung ein Datenrahmen Index kann

df1 = df[df["2016_max"] > df["hist_max"]] 

Diese dann mit matplotlib leicht aufgetragen.

u = u"""Day_of_Year  hist_min hist_max 2016_min 2016_max 
1    1000 10000   898  9000 
2    234  896   300  1000 
3    1254 23666  1000 24000 
4    930 78999  1000  1050 
5    278 74588   300  5000""" 

import io 
import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.read_csv(io.StringIO(u), index_col=0, delim_whitespace=True) 

df1 = df[df["2016_max"] > df["hist_max"]] 
df2 = df[df["2016_min"] < df["hist_min"]] 

fig, ax = plt.subplots() 
ax.scatter(df1.index, df1["2016_max"], label="max. 2016") 
ax.scatter(df2.index, df1["2016_min"], label="min. 2016") 

plt.legend() 
plt.show() 

enter image description here

Verwandte Themen