[PYTHON] [Pandas 1.0.1 Memorial] Heftiger Kampfrekord mit Kochbuch

Hintergrund

Was und wie

Über die Struktur dieses Beitrags


pandas logo

\small{\mathsf{ Date:Feb \ 05, 2020 \ Version: 1.0.1 }}

Pandas Official Site Cookbook

Redewendungen (Redewendung)

Wenn, dann ...

Verwenden Sie if-then / if-then-else für eine Spalte und weisen Sie es einer oder mehreren anderen Spalten zu.

In [1]: df = pd.DataFrame({'AAA': [4, 5, 6, 7],
                           'BBB': [10, 20, 30, 40],
                           'CCC': [100, 50, -30, -50]})

In [2]: df
Out[2]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

1 Reihe wenn-dann

df.loc[df.AAA >= 5, 'BBB'] = -1

Beispiel für Wenn-Dann, das zwei Spalten zugewiesen ist

df.loc[df.AAA >= 5, ['BBB', 'CCC']] = 555

Ändern Sie die Bedingung und aktualisieren Sie eine weitere Zeile

df.loc[df.AAA < 5, ['BBB', 'CCC']] = 2000

Konditioniert, um den Wert zu maskieren

In [9]: df_mask = pd.DataFrame({'AAA': [True] * 4,
                                'BBB': [False] * 4,
                                'CCC': [True, False] * 2})

In [10]: df.where(df_mask, -1000)
Out[10]: 
   AAA   BBB   CCC
0    4 -1000  2000
1    5 -1000 -1000
2    6 -1000   555
3    7 -1000 -1000

** [Code lesen] ** </ font>

  • Beim Erstellen eines Datenrahmens wird [True] * 4 zu [True, True, True, True].
  • Der Inhalt von mask_df lautet wie folgt.
AAA BBB CCC
0 True False True
1 True False False
2 True False True
3 True False False
  • Wobei die Methode das Element verwendet, wenn das erste Argument True ist, andernfalls wird das zweite Argument verwendet.

Verwenden Sie np.where, um if-then-else zu ersetzen: thumbsup:

# np.where(condition, true, false)
df['logic'] = np.where(df['AAA'] > 5, 'high', 'low')
AAA BBB CCC logic
0 4 2000 2000 low
1 5 555 555 low
2 6 555 555 high
3 7 555 555 high

Aufteilen

In [16]: df
Out[16]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

In [17]: df[df.AAA <= 5]
Out[17]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50

In [18]: df[df.AAA > 5]
Out[18]: 
   AAA  BBB  CCC
2    6   30  -30
3    7   40  -50

Datenrahmen nach Booleschem Wert teilen: clipboard :: thumbsup:

id sex age visits points
0 128 1 36 6 1980
1 324 0 29 9 -50
2 287 0 41 12 -239
3 423 1 33 33 1570
4 589 0 19 10 10

Teilen wir dies durch einen Booleschen Wert.

** [Code lesen] ** </ font>

#Überprüfen Sie den Booleschen Wert von m
m = df['sex'] != 0
m
0     True
1    False
2    False
3     True
4    False
Name: sex, dtype: bool
#Extrahieren mit Bedingung m, Extrahieren mit Negation von m
female, male = df[m], df[~m]

female

id sex age visits points
0 128 1 36 6 1980
3 423 1 33 33 1570

male

id sex age visits points
1 324 0 29 9 -50
2 287 0 41 12 -239
4 589 0 19 10 10

Baukriterien

id sex age visits points
0 128 1 36 6 1980
1 324 0 29 9 -50
2 287 0 41 12 -239
3 423 1 33 33 1570
4 589 0 19 10 10
# (Ein Zustand) & (B Zustand)und führt zu einem Fehler
df.loc[(df['BBB'] < 25) & (df['CCC'] >= -40), 'AAA']
0    4
1    5
Name: AAA, dtype: int64
# (Ein Zustand) | (B Zustand)oder führt zu einem Fehler
 df.loc[(df['BBB'] > 25) | (df['CCC'] >= -40), 'AAA']
0    4
1    5
2    6
3    7
Name: AAA, dtype: int64
# &,|Sie können die Daten mit aktualisieren
df.loc[(df['BBB'] > 25) | (df['CCC'] >= 75), 'AAA'] = 0.1
AAA BBB CCC
0 0.1 10 100
1 5 20 50
2 0.1 30 -30
3 0.1 40 -50

Verwenden Sie die Argsort-Funktion, um die Zeile mit den Daten auszuwählen, die einem bestimmten Wert am nächsten liegen

df = pd.DataFrame({'AAA': [4, 5, 6, 7],
                   'BBB': [10, 20, 30, 40],
                   'CCC': [100, 50, -30, -50]})

In [26]: df
Out[26]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

In [27]: aValue = 43.0

In [28]: df.loc[(df.CCC - aValue).abs().argsort()]
Out[28]: 
   AAA  BBB  CCC
1    5   20   50
0    4   10  100
2    6   30  -30
3    7   40  -50

** [Code lesen] ** </ font>

#Einfache Berechnung
(df.CCC - aValue)
0    57.0
1     7.0
2   -73.0
3   -93.0
Name: CCC, dtype: float64
#Machen Sie das Ergebnis einer einfachen Berechnung zu einem absoluten Wert
(df.CCC - aValue).abs()
0    57.0
1     7.0
2    73.0
3    93.0
Name: CCC, dtype: float64
#Gibt den Index des Ergebnisses der Sortierung der Zahlen mit dem Ergebnis einer einfachen Berechnung als absoluten Wert zurück.
(df.CCC - aValue).abs().argsort()
0    1
1    0
2    2
3    3
Name: CCC, dtype: int64

Filtern Sie die Liste der Kriterien dynamisch mit dem Binomialoperator


In [29]: df = pd.DataFrame({'AAA': [4, 5, 6, 7],
                            'BBB': [10, 20, 30, 40],
                            'CCC': [100, 50, -30, -50]})

In [30]: df
Out[30]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

In [31]: Crit1 = df.AAA <= 5.5
In [32]: Crit2 = df.BBB == 10.0
In [33]: Crit3 = df.CCC > -40.0
#Mit harter Codierung kombinieren
In [34]: AllCrit = Crit1 & Crit2 & Crit3

In [35]: import functools
In [36]: CritList = [Crit1, Crit2, Crit3]
#Erstellen Sie alle Bedingungen (integriert) mit der Reduktionsfunktion
In [37]: AllCrit = functools.reduce(lambda x, y: x & y, CritList)

In [38]: df[AllCrit]
Out[38]: 
   AAA  BBB  CCC
0    4   10  100

** [Code lesen] ** </ font>

#Überprüfen Sie jede Bedingung als Datenrahmen.
tmp = pd.DataFrame({'CritList_0':CritList[0].tolist(),
                    'CritList_1':CritList[1].tolist(),
                    'CritList_2':CritList[2].tolist(),
                    'AllCrit':AllCrit.tolist()
                   }, index=[0,1,2,3])
  • In "AllCrit" multipliziert mit allen Bedingungen ist "True" die Zeile mit dem Index "0".
CritList_0 CritList_1 CritList_2 AllCrit
0 True True True True
1 True False True False
2 False False True False
3 False False False False

Auswahl

Datenrahmen

Verwenden Sie sowohl Zeilenbeschriftungen als auch Wertebedingungen: thumbsup:

In [39]: df = pd.DataFrame({'AAA': [4, 5, 6, 7],
                            'BBB': [10, 20, 30, 40],
                            'CCC': [100, 50, -30, -50]}) 

In [40]: df
Out[40]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

In [41]: df[(df.AAA <= 6) & (df.index.isin([0, 2, 4]))]
Out[41]: 
   AAA  BBB  CCC
0    4   10  100
2    6   30  -30

Verwenden Sie loc zum Schneiden auf dem Etikett und iloc für die Positionsscheibe

AAA BBB CCC
foo 4 10 100
bar 5 20 50
boo 6 30 -30
kar 7 40 -50
In [43]: df.loc['bar':'kar']  # Label
Out[43]: 
     AAA  BBB  CCC
bar    5   20   50
boo    6   30  -30
kar    7   40  -50

# Generic
In [44]: df.iloc[0:3]
Out[44]: 
     AAA  BBB  CCC
foo    4   10  100
bar    5   20   50
boo    6   30  -30

** Wichtige Punkte gelernt **

  • Positionsorientiert (Python-Slicing-Stil: ohne Terminierung)
  • Label-orientiert (Nicht-Python-Slice-Stil: einschließlich Terminierung)

Probleme treten auf, wenn der Index aus einem Start ungleich Null oder nicht inkrementellen Ganzzahlen besteht

In [46]: data = {'AAA': [4, 5, 6, 7],
                 'BBB': [10, 20, 30, 40],
                 'CCC': [100, 50, -30, -50]}

#Hinweis: Der Index beginnt bei 1
In [47]: df2 = pd.DataFrame(data=data, index=[1, 2, 3, 4])  
In [48]: df2.iloc[1:3]  #Positionsorientiert
Out[48]: 
   AAA  BBB  CCC
2    5   20   50
3    6   30  -30

In [49]: df2.loc[1:3]  #Etikettenorientiert
Out[49]: 
   AAA  BBB  CCC
1    4   10  100
2    5   20   50
3    6   30  -30

Verweigern Sie die Bedingung mit dem Vergleichsoperator (~) [Not]

In [50]: df = pd.DataFrame({'AAA': [4, 5, 6, 7],
                            'BBB': [10, 20, 30, 40],
                            'CCC': [100, 50, -30, -50]})

In [51]: df
Out[51]: 
   AAA  BBB  CCC
0    4   10  100
1    5   20   50
2    6   30  -30
3    7   40  -50

In [52]: df[~((df.AAA <= 6) & (df.index.isin([0, 2, 4])))]
Out[52]: 
   AAA  BBB  CCC
1    5   20   50
3    7   40  -50

** [Code lesen] ** </ font>

# `~`Wenn Sie es unter der Bedingung bekommen, dass nicht verwendet
df[((df.AAA <= 6) & (df.index.isin([0, 2, 4])))]
AAA BBB CCC
0 4 10 100
2 6 30 -30
Da dieser Inhalt negativ ist, werden die Indizes 1 und 3 ausgewählt.

Neue Spalten

Erstellen Sie mithilfe der Funktion applymap effizient und dynamisch neue Spalten: thumbsup:

In [53]: df = pd.DataFrame({'AAA': [1, 2, 1, 3],
                            'BBB': [1, 1, 2, 2],
                            'CCC': [2, 1, 3, 1]})


In [54]: df
Out[54]: 
   AAA  BBB  CCC
0    1    1    2
1    2    1    1
2    1    2    3
3    3    2    1

In [55]: source_cols = df.columns   #Bestehenden Spaltennamen abrufen

In [56]: new_cols = [str(x) + "_cat" for x in source_cols]

In [57]: categories = {1: 'Alpha', 2: 'Beta', 3: 'Charlie'}

In [58]: df[new_cols] = df[source_cols].applymap(categories.get)

In [59]: df
Out[59]: 
   AAA  BBB  CCC  AAA_cat BBB_cat  CCC_cat
0    1    1    2    Alpha   Alpha     Beta
1    2    1    1     Beta   Alpha    Alpha
2    1    2    3    Alpha    Beta  Charlie
3    3    2    1  Charlie    Beta    Alpha

** [Code lesen] ** </ font>

#Rufen Sie einen vorhandenen Spaltennamen ab
source_cols = df.columns
source_cols
Index(['AAA', 'BBB', 'CCC'], dtype='object')
#Zu einem vorhandenen Spaltennamen`_cat`Erstellen Sie eine Liste hinzugefügt zu
new_cols = [str(x) + "_cat" for x in source_cols]
new_cols
['AAA_cat', 'BBB_cat', 'CCC_cat']
Aktualisieren Sie neue Spalten ['AAA_cat', 'BBB_cat', 'CCC_cat'] mit Werten aus dem Wörterbuch "Kategorien" für vorhandene Spalten

Wenn Sie min () mit groupby verwenden, behalten Sie andere Spalten bei

In [60]: df = pd.DataFrame({'AAA': [1, 1, 1, 2, 2, 2, 3, 3],
                            'BBB': [2, 1, 3, 4, 5, 1, 2, 3]})

In [61]: df
Out[61]: 
   AAA  BBB
0    1    2
1    1    1
2    1    3
3    2    4
4    2    5
5    2    1
6    3    2
7    3    3

Methode 1: Holen Sie sich den kleinsten Index idxmin ()

In [62]: df.loc[df.groupby("AAA")["BBB"].idxmin()]
Out[62]: 
   AAA  BBB
1    1    1
5    2    1
6    3    2

Methode 2: Sortieren und dann jeweils zuerst abrufen

In [63]: df.sort_values(by="BBB").groupby("AAA", as_index=False).first()
Out[63]: 
   AAA  BBB
0    1    1
1    2    1
2    3    2

** [Code lesen] ** </ font>

  • Methode 1
# 'AAA'Nach Spalte gruppieren
gb = df.groupby("AAA")["BBB"]
# 'AAA'Von der Säule'2'Wenn Sie erhalten, wird der folgende Inhalt angezeigt.'AAA'Von der Säule'2'Der Mindestwert von'1'Wird
gb.get_group(2)
3    4
4    5
5    1
Name: BBB, dtype: int64
  • Methode 2
# 'BBB'Nach Spalte sortieren
sv = df.sort_values(by="BBB")
sv
	AAA	BBB
1	1	1
5	2	1
0	1	2
6	3	2
2	1	3
7	3	3
3	2	4
4	2	5
# 'AAA'Nach Spalte gruppieren
gb = sv.groupby("AAA", as_index=False)
# 'AAA'Von der Säule'2'Wenn Sie den Mindestwert erhalten'1'
gb.get_group(2)
	AAA	BBB
5	2	1
3	2	4
4	2	5
#Holen Sie sich den Anfang eines Gruppenobjekts
gb.first()
	AAA	BBB
0	1	1
1	2	1
2	3	2

MultiIndexing

Erstellen Sie einen MultiIndex aus einem beschrifteten Frame

In [64]: df = pd.DataFrame({'row': [0, 1, 2],
                           'One_X': [1.1, 1.1, 1.1],
                           'One_Y': [1.2, 1.2, 1.2],
                           'Two_X': [1.11, 1.11, 1.11],
                           'Two_Y': [1.22, 1.22, 1.22]})

In [65]: df
Out[65]: 
   row  One_X  One_Y  Two_X  Two_Y
0    0    1.1    1.2   1.11   1.22
1    1    1.1    1.2   1.11   1.22
2    2    1.1    1.2   1.11   1.22

#Beschrifteter Index
In [66]: df = df.set_index('row')

In [67]: df
Out[67]: 
     One_X  One_Y  Two_X  Two_Y
row                            
0      1.1    1.2   1.11   1.22
1      1.1    1.2   1.11   1.22
2      1.1    1.2   1.11   1.22

#Vorhandener Spaltenname'_'Teilen Sie mit und wechseln Sie zu einem hierarchischen Index im Tapple-Format.
In [68]: df.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])

In [69]: df
Out[69]: 
     One        Two      
       X    Y     X     Y
row                      
0    1.1  1.2  1.11  1.22
1    1.1  1.2  1.11  1.22
2    1.1  1.2  1.11  1.22

#Machen Sie die hierarchischen Indexspaltendaten und setzen Sie den Index zurück
In [70]: df = df.stack(0).reset_index(1)

In [71]: df
Out[71]: 
    level_1     X     Y
row                    
0       One  1.10  1.20
0       Two  1.11  1.22
1       One  1.10  1.20
1       Two  1.11  1.22
2       One  1.10  1.20
2       Two  1.11  1.22

#Ändern Sie die Beschriftung (Beschriftung "Ebene")_Beachten Sie, dass "1" automatisch hinzugefügt wurde.
In [72]: df.columns = ['Sample', 'All_X', 'All_Y']

In [73]: df
Out[73]: 
    Sample  All_X  All_Y
row                     
0      One   1.10   1.20
0      Two   1.11   1.22
1      One   1.10   1.20
1      Two   1.11   1.22
2      One   1.10   1.20
2      Two   1.11   1.22

** [Code lesen] ** </ font>

#Vorhandene Spalten in Einschlussnotation'_'Teilen durch
[tuple(c.split('_')) for c in df.columns]
[('One', 'X'), ('One', 'Y'), ('Two', 'X'), ('Two', 'Y')]
#Der hierarchische Index wird im Tapple-Format ausgedrückt
df.columns = pd.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
df.columns
MultiIndex([('One', 'X'),
            ('One', 'Y'),
            ('Two', 'X'),
            ('Two', 'Y')],
           )
#Von Spalte zu Zeile schwenken
df = df.stack(0)
		X	Y
row			
0	One	1.10	1.20
	Two	1.11	1.22
1	One	1.10	1.20
	Two	1.11	1.22
2	One	1.10	1.20
	Two	1.11	1.22

#Indexebene=1('One,Two')Zurücksetzen df.reset_index(1) level_1 X Y row 0 One 1.10 1.20 0 Two 1.11 1.22 1 One 1.10 1.20 1 Two 1.11 1.22 2 One 1.10 1.20 2 Two 1.11 1.22


## Arithmetik
 * Der folgende Code enthält einige Änderungen gegenüber der offiziellen Website.

```python
In [74]: cols = pd.MultiIndex.from_tuples([(x, y) for x in ['A', 'B', 'C'] for y in ['O', 'I']])

In [75]: df = pd.DataFrame(np.arange(12).reshape((2,6)), index=['n', 'm'], columns=cols)

In [76]: df
Out[76]: 
	A		B		C
	O	I	O	I	O	I
n	0	1	2	3	4	5
m	6	7	8	9	10	11

In [77]: df = df.div(df['C'], level=1)

In [78]: df
Out[78]: 

	A				B				C
	O	I			O	I			O	I
n	0.0	0.200000	0.5	0.600000	1.0	1.0
m	0.6	0.636364	0.8	0.818182	1.0	1.0

** [Code lesen] ** </ font>

Die Zeile $ n in Spalte B ist $ $ [B][O](2 \div 4 = 0.5) $ $ [B][I](3 \div 5 = 0.600000) $

A B C
O I O I O I
n 0.0 0.200000 0.5 0.600000 1.0 1.0
m 0.6 0.636364 0.8 0.818182 1.0 1.0

Scheibe

coords = [('AA', 'one'), ('AA', 'six'), ('BB', 'one'), ('BB', 'two'), ('BB', 'six')]
index = pd.MultiIndex.from_tuples(coords)
df = pd.DataFrame([11, 22, 33, 44, 55], index, ['MyData'])
MyData
AA one 11
six 22
BB one 33
two 44
six 55

Auswahl aus der ersten Ebene und der ersten Achse

#Erste Achse
df.xs('BB', level=0, axis=0)
MyData
one 33
two 44
six 55

Auswahl aus dem sechsstufigen und der ersten Achse

#Zweite Achse
df.xs('six', level=1, axis=0)
MyData
AA 22
BB 55
In [85]: import itertools
In [86]: index = list(itertools.product(['Ada', 'Quinn', 'Violet'],
                                        ['Comp', 'Math', 'Sci']))
In [87]: headr = list(itertools.product(['Exams', 'Labs'], ['I', 'II']))
In [88]: indx = pd.MultiIndex.from_tuples(index, names=['Student', 'Course'])
In [89]: cols = pd.MultiIndex.from_tuples(headr)   # Notice these are un-named
In [90]: data = [[70 + x + y + (x * y) % 3 for x in range(4)] for y in range(9)]
In [91]: df = pd.DataFrame(data, indx, cols)

In [92]: df
Out[92]: 
               Exams     Labs    
                   I  II    I  II
Student Course                   
Ada     Comp      70  71   72  73
        Math      71  73   75  74
        Sci       72  75   75  75
Quinn   Comp      73  74   75  76
        Math      74  76   78  77
        Sci       75  78   78  78
Violet  Comp      76  77   78  79
        Math      77  79   81  80
        Sci       78  81   81  81

In [93]: All = slice(None)

In [94]: df.loc['Violet']
Out[94]: 
       Exams     Labs    
           I  II    I  II
Course                   
Comp      76  77   78  79
Math      77  79   81  80
Sci       78  81   81  81

In [95]: df.loc[(All, 'Math'), All]
Out[95]: 
               Exams     Labs    
                   I  II    I  II
Student Course                   
Ada     Math      71  73   75  74
Quinn   Math      74  76   78  77
Violet  Math      77  79   81  80

In [96]: df.loc[(slice('Ada', 'Quinn'), 'Math'), All]
Out[96]: 
               Exams     Labs    
                   I  II    I  II
Student Course                   
Ada     Math      71  73   75  74
Quinn   Math      74  76   78  77

In [97]: df.loc[(All, 'Math'), ('Exams')]
Out[97]: 
                 I  II
Student Course        
Ada     Math    71  73
Quinn   Math    74  76
Violet  Math    77  79

In [98]: df.loc[(All, 'Math'), (All, 'II')]
Out[98]: 
               Exams Labs
                  II   II
Student Course           
Ada     Math      73   74
Quinn   Math      76   77
Violet  Math      79   80

** [Code lesen] ** </ font>

All = slice(None) #Was bedeutet das?
# silice(start, stop, step)Also, gibt es drei Keine?
All
slice(None, None, None)
print(type(All))
# <class 'slice'> #Objekt in Scheiben schneiden
  • Ich habe es mit "ALL = None" versucht, aber es wird eine Fehlermeldung angezeigt. Die Extraktionsbedingung muss also ein Slice-Objekt sein.
  • Hier bedeutet "ALL", dass keine Bedingung angegeben ist
indx
MultiIndex([(   'Ada', 'Comp'),
            (   'Ada', 'Math'),
            (   'Ada',  'Sci'),
            ( 'Quinn', 'Comp'),
            ( 'Quinn', 'Math'),
            ( 'Quinn',  'Sci'),
            ('Violet', 'Comp'),
            ('Violet', 'Math'),
            ('Violet',  'Sci')],
           names=['Student', 'Course'])
cols
MultiIndex([('Exams',  'I'),
            ('Exams', 'II'),
            ( 'Labs',  'I'),
            ( 'Labs', 'II')],
           )

Sortierung

Verwenden Sie MultiIndex, um nach einer bestimmten Spalte oder einer geordneten Liste von Spalten zu sortieren

df.sort_values(by=('Labs', 'II'), ascending=False)
Exams Labs
I II I II
Student Course
Violet Sci 78 81 81 81
Math 77 79 81 80
Comp 76 77 78 79
Quinn Sci 75 78 78 78
Math 74 76 78 77
Comp 73 74 75 76
Ada Sci 72 75 75 75
Math 71 73 75 74
Comp 70 71 72 73

Ebenen

Ebene vor Multi-Index hinzufügen: clipboard :: thumbsup:

#Zu diesem DF'Firstlevel:Foo'Wie man hinzufügen?
pd.concat([df], keys=['Foo'], names=['Firstlevel'])
Exams Labs
I II I II
Firstlevel Student Course
Foo Ada Comp 70 71 72 73
Math 71 73 75 74
Sci 72 75 75 75
Quinn Comp 73 74 75 76
Math 74 76 78 77
Sci 75 78 78 78
Violet Comp 76 77 78 79
Math 77 79 81 80
Sci 78 81 81 81

So reduzieren Sie den hierarchischen Index: Zwischenablage:

df.columns = df.columns.get_level_values(0)
Exams Labs
I II I II
Student Course
Ada Comp 70 71 72 73
Math 71 73 75 74
Sci 72 75 75 75
Quinn Comp 73 74 75 76
Math 74 76 78 77
Sci 75 78 78 78
Violet Comp 76 77 78 79
Math 77 79 81 80
Sci 78 81 81 81

Fehlende Daten

Füllen Sie die umgekehrte Reihenfolge der Zeitreihen mit Vorwärtsdaten

In [100]: df = pd.DataFrame(np.random.randn(6, 1),
                            index=pd.date_range('2013-08-01', periods=6, freq='B'),
                            columns=list('A'))

In [101]: df.loc[df.index[3], 'A'] = np.nan

In [102]: df
Out[102]: 
                   A
2013-08-01  0.721555
2013-08-02 -0.706771
2013-08-05 -1.039575
2013-08-06       NaN
2013-08-07 -0.424972
2013-08-08  0.567020

In [103]: df.reindex(df.index[::-1]).ffill()
Out[103]: 
                   A
2013-08-08  0.567020
2013-08-07 -0.424972
2013-08-06 -0.424972
2013-08-05 -1.039575
2013-08-02 -0.706771
2013-08-01  0.721555

** [Code lesen] ** </ font>

df.reindex(df.index[::-1]).ffill()
df.reindex(df.index[::-1]).fillna(method='ffill')  #Synonym für oben

Das Obige ist ein Beispiel für das Zurücksetzen des Index in umgekehrter Reihenfolge des Index und das Ausfüllen der Lücken mit "fiillna (method =" ffill "). Die Funktion fillna ist vielseitiger als ffill (), da Siemode = 'ffill' (vorwärts) und 'bfill (rückwärts)'verwenden können, um die Lücken zu füllen.

Kumulativ mit NaN zurücksetzen: clipboard :: thumbsup:

v = pd.Series([1, 1, 1, np.nan, 1, 1, 1, 1, np.nan, 1], dtype=float)
n = v.isnull()
a = ~n
c = a.astype(float).cumsum()
d = pd.Series(np.diff(np.hstack(([0.], c[n]))), index=index)
v[n] = -d
result = v.cumsum()
result
    0    1.0
    1    2.0
    2    3.0
    3    0.0
    4    1.0
    5    2.0
    6    3.0
    7    4.0
    8    0.0
    9    1.0
    dtype: float64

** [Code lesen] ** </ font> $ (1) Erstellen Sie Daten mit Nan-Werten $ $ v = pd.Series([1, 1, 1, np.nan, 1, 1, 1, 1, np.nan, 1], dtype=float) \tag{1} $ $ (2) n erhält den NaN-Wert als Booleschen Wert $ $ n = v.isnull() \tag{2} $ $ (3) a invertiert den Booleschen Wert von n $ $ a = \tilde~n \tag{3} $ $ (4) Akkumulieren Sie basierend auf dem Booleschen Wert eines $ $ c = a.astype(float).cumsum() \tag{4} $ $ (5) Ermittelt den False-Index von n aus den integrierten Daten $ $ index = c[n].index \tag{5} $ $ (6) Ermitteln Sie die Differenz von 0 zu c [n] $ $ d = pd.Series(np.diff(np.hstack(([0.], c[n]))), index=index) \tag{6} $ Ersetzen Sie den in $ (7) (6) erhaltenen numerischen Wert durch False of v als negativen Wert $ $ v[n] = -d \tag{7} $ Wenn die Daten von $ (8) (7) integriert sind, wird der negative Wert 0. $ $ result = v.cumsum() \tag{8} $

\begin
{array}{|c|c|c|c|c|c|c|r|c|} \hline
  &  (1)  &  (2)   &  (3)  & (4) &(5)&(6)& (7)  & (8) \\ \hline 
0 &   1.0 &  False & True  & 1.0 &   &   & 1.0  &  1.0 \\ \hline
1 &   1.0 &  False & True  & 2.0 &   &   & 1.0  &  2.0 \\ \hline
2 &   1.0 &  False & True  & 3.0 &   &   & 1.0  &  3.0 \\ \hline
3 &   NaN &  True  & False & 3.0 & 3 & 3 & -3.0 &  0.0 \\ \hline
4 &   1.0 &  False & True  & 4.0 &   &   & 1.0  &  1.0 \\ \hline
5 &   1.0 &  False & True  & 5.0 &   &   & 1.0  &  2.0 \\ \hline
6 &   1.0 &  False & True  & 6.0 &   &   & 1.0  &  3.0 \\ \hline
7 &   1.0 &  False & True  & 7.0 &   &   & 1.0  &  4.0 \\ \hline
8 &   NaN &  True  & False & 7.0 & 8 & 4 & -4.0 &  0.0 \\ \hline
9 &   1.0 &  False & True  & 8.0 &   &   & 1.0 &  1.0 \\ \hline
\end{array}

Gruppierung

Im Gegensatz zur Agg-Funktion gibt die Apply-Funktion einen Datenrahmen zurück, der auf alle Spalten zugreifen kann.

df = pd.DataFrame({'animal': 'cat dog cat fish dog cat cat'.split(), 
                    'size': list('SSMMMLL'), 
                    'weight': [8, 10, 11, 1, 20, 12, 12], 
                    'adult': [False] * 5 + [True] * 2})
In [105]: df
Out[105]: 
  animal size  weight  adult
0    cat    S       8  False
1    dog    S      10  False
2    cat    M      11  False
3   fish    M       1  False
4    dog    M      20  False
5    cat    L      12   True
6    cat    L      12   True

#Listen Sie die Größen der schwersten Tiere auf.
In [106]: df.groupby('animal').apply(lambda subf: subf['size'][subf['weight'].idxmax()])
Out[106]: 
animal
cat     L
dog     M
fish    M
dtype: object

** [Code lesen] ** </ font>

#Wenn Sie dies zerlegen
df.groupby('animal').apply(lambda subf: subf['size'][subf['weight'].idxmax()])
# 'weight'Aus dem Index des Elements mit dem Maximalwert'size'Holen Sie sich das Element von
df['size'][df['weight'].idxmax()]
   'M'
#So können Sie die maximale Größe der gruppierten Inhalte erhalten

Verwenden Sie die Funktion get_group

In [107]: gb = df.groupby(['animal'])
# 'get_group'Verwenden Sie diese Option, um den Inhalt des GroupBy-Objekts zu überprüfen
In [108]: gb.get_group('cat')
Out[108]: 
  animal size  weight  adult
0    cat    S       8  False
2    cat    M      11  False
5    cat    L      12   True
6    cat    L      12   True

** [Code lesen] ** </ font>

#Zugriff auf das von groupby erfasste Objekt
gb[['animal', 'size', 'weight']].get_group('cat')
animal size weight
0 cat S 8
2 cat M 11
5 cat L 12
6 cat L 12

Auf verschiedene Elemente in der Gruppe anwenden

In [109]: def GrowUp(x):
              avg_weight = sum(x[x['size'] == 'S'].weight * 1.5)
              avg_weight += sum(x[x['size'] == 'M'].weight * 1.25)
              avg_weight += sum(x[x['size'] == 'L'].weight)
              avg_weight /= len(x)
              return pd.Series(['L', avg_weight, True], index=['size', 'weight', 'adult'])

In [110]: expected_df = gb.apply(GrowUp)

In [111]: expected_df
Out[111]: 
       size   weight  adult
animal                     
cat       L  12.4375   True
dog       L  20.0000   True
fish      L   1.2500   True

** [Code lesen] ** </ font>

#Berechnung der S-Größe
cat_s = sum(df[(df['animal'] == 'cat') & (df['size'] == 'S')].weight * 1.5)
cat_s
12.0
#Berechnung der M-Größe
cat_m = sum(df[(df['animal'] == 'cat') & (df['size'] == 'M')].weight * 1.25)
cat_m
13.75
#Berechnung der L-Größe
cat_l = sum(df[(df['animal'] == 'cat') & (df['size'] == 'L')].weight)
cat_l
24
# 'SML-Durchschnitt
cat_avg = (cat_s + cat_m + cat_l) / len(df[df['animal'] == 'cat'])
cat_avg
12.4375
#Das erhaltene Ergebnis ist pd.Rückkehr im Serienformat

Funktion auf alle Fälle anwenden

Der folgende Code enthält einige numerische Änderungen gegenüber der offiziellen Website.

# S = pd.Series([i / 100.0 for i in range(1, 11)])
S = pd.Series([i for i in range(1, 11)])

S
    0     1
    1     2
    2     3
    3     4
    4     5
    5     6
    6     7
    7     8
    8     9
    9    10
    dtype: int64
def cum_ret(x, y):
    return x * (1 + y)

def red(x):
    p = functools.reduce(cum_ret, x, 1.0)
    return p
#Erweitern, um alle Daten auszuführen().[mean(),std()...]
S.expanding().apply(red, raw=True)

0           2.0
1           6.0
2          24.0
3         120.0
4         720.0
5        5040.0
6       40320.0
7      362880.0
8     3628800.0
9    39916800.0
dtype: float64

** [Code lesen] ** </ font>

$ x=1 $

$ 1: Die rote Funktion (x) heißt und x = 1.0. Dann $

$ 2: Die cum \ _ ret-Funktion (x, y) wird aufgerufen und x * (1 + y) = 1.0 * (1.0 + 1.0) = 2.0 wird von x = 1, y = 1 $ zurückgegeben

$ 3:p=2.0 $

$ x=2 $

$ p=6.0((12)(1+2)) $

$ x=3 $

$ p=24.0((123)*(1+3)) $

$ x=4 $

$ p=120.0((1234)(1+4)) $

Ersetzen Sie durch den Durchschnittswert der Gruppe mit Ausnahme von Werten unter 0

In [116]: df = pd.DataFrame({'A': [1, 1, 2, 2], 'B': [1, -1, 1, 2]})
	A	B
0	1	1
1	1	-1
2	2	1
3	2	2

In [117]: gb = df.groupby('A')
In [118]: def replace(g):
              mask = g < 0
              return g.where(mask, g[~mask].mean())

In [119]: gb.transform(replace)
Out[119]: 
     B
0  1.0
1 -1.0
2  1.5
3  1.5

Ersetzen Sie Werte unter 0 durch Gruppenmittelwerte: clipboard :: thumbsup:

df = pd.DataFrame({'A' : [1, 1, 1, 2, 2, 2], 'B' : [2, 3, -1, 1, 2, 6]})
gb = df.groupby('A')
def replace(g):
    mask = g < 0
    g.loc[mask] = g[~mask].mean()
    return g
gb.transform(replace)

	B
0	2.0
1	3.0
2	2.5
3	1.0
4	2.0
5	6.0

Sortieren Sie Gruppen nach aggregierten Daten

In [120]: df = pd.DataFrame({'code': ['foo', 'bar', 'baz'] * 2,
                             'data': [0.16, -0.21, 0.33, 0.45, -0.59, 0.62],
                             'flag': [False, True] * 3})

In [121]: code_groups = df.groupby('code')

In [122]: agg_n_sort_order = code_groups[['data']].transform(sum).sort_values(by='data')

In [123]: sorted_df = df.loc[agg_n_sort_order.index]

In [124]: sorted_df
Out[124]: 
  code  data   flag
1  bar -0.21   True
4  bar -0.59  False
0  foo  0.16  False
3  foo  0.45   True
2  baz  0.33  False
5  baz  0.62   True

** [Code lesen] ** </ font>

# 'data'Gruppieren Sie nach und finden Sie die Summe und sortieren Sie.
agg_n_sort_order = code_groups[['data']].transform(sum).sort_values(by='data')
	data
1	-0.80
4	-0.80
0	0.61
3	0.61
2	0.95
5	0.95
#Suchen und extrahieren Sie als Nächstes den Index
agg_n_sort_order.index
Int64Index([1, 4, 0, 3, 2, 5], dtype='int64')

Erstellen Sie mehrere Zusammenfassungsspalten

In [125]: rng = pd.date_range(start="2014-10-07", periods=10, freq='2min')

In [126]: ts = pd.Series(data=list(range(10)), index=rng)

In [127]: def MyCust(x):
              if len(x) > 2:
                  return x[1] * 1.234
              return pd.NaT 

In [128]: mhc = {'Mean': np.mean, 'Max': np.max, 'Custom': MyCust}

In [129]: ts.resample("5min").apply(mhc)
Out[129]: 
Mean    2014-10-07 00:00:00        1
        2014-10-07 00:05:00      3.5
        2014-10-07 00:10:00        6
        2014-10-07 00:15:00      8.5
Max     2014-10-07 00:00:00        2
        2014-10-07 00:05:00        4
        2014-10-07 00:10:00        7
        2014-10-07 00:15:00        9
Custom  2014-10-07 00:00:00    1.234
        2014-10-07 00:05:00      NaT
        2014-10-07 00:10:00    7.404
        2014-10-07 00:15:00      NaT
dtype: object

In [130]: ts
Out[130]: 
2014-10-07 00:00:00    0
2014-10-07 00:02:00    1
2014-10-07 00:04:00    2
2014-10-07 00:06:00    3
2014-10-07 00:08:00    4
2014-10-07 00:10:00    5
2014-10-07 00:12:00    6
2014-10-07 00:14:00    7
2014-10-07 00:16:00    8
2014-10-07 00:18:00    9
Freq: 2T, dtype: int64

** [Code lesen] ** </ font>

#TimeSeries-Objekt'5min'Nachzählen zu
ts_re = ts.resample('5min')
#Zeigen Sie den Inhalt des Objekts an
for t in ts_re:
    print(t)
(Timestamp('2014-10-07 00:00:00', freq='5T'),   2014-10-07 00:00:00    0
                                                2014-10-07 00:02:00    1
                                                2014-10-07 00:04:00    2
                                                Freq: 2T, dtype: int64)
(Timestamp('2014-10-07 00:05:00', freq='5T'),   2014-10-07 00:06:00    3
                                                2014-10-07 00:08:00    4
                                                Freq: 2T, dtype: int64)
(Timestamp('2014-10-07 00:10:00', freq='5T'),   2014-10-07 00:10:00    5
                                                2014-10-07 00:12:00    6
                                                2014-10-07 00:14:00    7
                                                Freq: 2T, dtype: int64)
(Timestamp('2014-10-07 00:15:00', freq='5T'),   2014-10-07 00:16:00    8
                                                2014-10-07 00:18:00    9
                                                Freq: 2T, dtype: int64)
ts data mean max MyCust x[1]
0 2014-10-07 00:00:00 0,1,2 1 2 1.234 1
1 2014-10-07 00:05:00 3,4 3.5 4 NaT False
2 2014-10-07 00:10:00 5,6,7 6 7 7.404 6
3 2014-10-07 00:15:00 8,9 8.5 9 NaT False

Erstellen Sie eine Wertzählspalte und weisen Sie sie einem DataFrame neu zu

In [131]: df = pd.DataFrame({'Color': 'Red Red Red Blue'.split(),
                             'Value': [100, 150, 50, 50]})

In [132]: df
Out[132]: 
  Color  Value
0   Red    100
1   Red    150
2   Red     50
3  Blue     50

In [133]: df['Counts'] = df.groupby(['Color']).transform(len)

In [134]: df
Out[134]: 
  Color  Value  Counts
0   Red    100       3
1   Red    150       3
2   Red     50       3
3  Blue     50       1

Verschieben Sie eine Gruppe von Spaltenwerten basierend auf dem Index

In [135]: df = pd.DataFrame({'line_race': [10, 10, 8, 10, 10, 8],
                             'beyer': [99, 102, 103, 103, 88, 100]},
                             index=['Last Gunfighter', 'Last Gunfighter', 'Last Gunfighter', 
                                    'Paynter', 'Paynter', 'Paynter'])

In [136]: df
Out[136]: 
                 line_race  beyer
Last Gunfighter         10     99
Last Gunfighter         10    102
Last Gunfighter          8    103
Paynter                 10    103
Paynter                 10     88
Paynter                  8    100

In [137]: df['beyer_shifted'] = df.groupby(level=0)['beyer'].shift(1)

In [138]: df
Out[138]: 
                 line_race  beyer  beyer_shifted
Last Gunfighter         10     99            NaN
Last Gunfighter         10    102           99.0
Last Gunfighter          8    103          102.0
Paynter                 10    103            NaN
Paynter                 10     88          103.0
Paynter                  8    100           88.0

Wählen Sie aus jeder Gruppe die Zeile mit dem Maximalwert aus

df = pd.DataFrame({'host': ['other', 'other', 'that', 'this', 'this'],
                   'service': ['mail', 'web', 'mail', 'mail', 'web'],
                   'no': [1, 2, 1, 2, 1]}).set_index(['host', 'service']

In [140]: mask = df.groupby(level=0).agg('idxmax')

In [141]: df_count = df.loc[mask['no']].reset_index()

In [142]: df_count
Out[142]: 
    host service  no
0  other     web   2
1   that    mail   1
2   this    mail   2

** [Code lesen] ** </ font>

no
host service
other mail 1
web 2
that mail 1
this mail 2
web 1
# level=Zeigen Sie den Inhalt von Maskenwerten an, die nach 0 gruppiert sind
mask = df.groupby(level=0).agg('idxmax')
		no
host 	
other 	(other, web)
that 	(that, mail)
this 	(this, mail)

Der maximale Index wird mit den im Tapple-Format gruppierten Daten erstellt. Der Index wird im Datenrahmen des durch diesen Maskenwert extrahierten Ergebnisses zurückgesetzt.

Gruppierung wie itertools.groupby

In [143]: df = pd.DataFrame([0, 1, 0, 1, 1, 1, 0, 1, 1], columns=['A'])

In [144]: df['A'].groupby((df['A'] != df['A'].shift()).cumsum()).groups
Out[144]: 
{1: Int64Index([0], dtype='int64'),
 2: Int64Index([1], dtype='int64'),
 3: Int64Index([2], dtype='int64'),
 4: Int64Index([3, 4, 5], dtype='int64'),
 5: Int64Index([6], dtype='int64'),
 6: Int64Index([7, 8], dtype='int64')}

In [145]: df['A'].groupby((df['A'] != df['A'].shift()).cumsum()).cumsum()
Out[145]: 
0    0
1    1
2    0
3    1
4    2
5    3
6    0
7    1
8    2
Name: A, dtype: int64

** [Code lesen] ** </ font>

#Datenrahmen oben
df
	A
0	0
1	1
2	0
3	1
4	1
5	1
6	0
7	1
8	1
  • Wenn Sie dieselben Daten mit itertools.groupby ausführen, wird der folgende Inhalt angezeigt.
data = [0, 1, 0, 1, 1, 1, 0, 1, 1]
gb = itertools.groupby(data)
for key, group in gb:
    print(f'{key}: {list(group)}')
0: [0]
1: [1]
0: [0]
1: [1, 1, 1]
0: [0]
1: [1, 1]
  • GroupBy.groups gibt Gruppennamen und Beschriftungen im Wörterbuchformat zurück.
tmp = df.groupby('A')
gb = tmp.groups
gb.get(1)
Int64Index([1, 3, 4, 5, 7, 8], dtype='int64')
gb.get(0)
Int64Index([0, 2, 6], dtype='int64')

$ (1) \ Beispieldaten $ $ df['A'] \tag{1} $ $ (2) \ Shift data $ $ df['A'].shift() \tag{2} $ True $, wenn $ (3) \ (2) und (3) nicht äquivalent sind $ df['A'] != df['A'].shift() \tag{3} $ Nehmen Sie die Ansammlung von $ (4) \ (3) $ $ (df['A'] != df['A'].shift()).cumsum() \tag{4} $ $ (5) \ Inhalt von Objekten, gruppiert nach kumulativen Daten $ $ gb = df['A'].groupby((df['A'] != df['A'].shift()).cumsum()) \tag{5} $ $ (6) \ Gruppierte Daten Kumulativ $ $ df['A'].groupby((df['A'] != df['A'].shift()).cumsum()).cumsum() \tag{6} $

\begin
{array}{|c|c|c|c|c|c|c|} \hline
 & (1) & (2) & (3) & (4) & (5) & (6) \\ \hline
0 & 0 &	NaN & True & 1 & 0 & 0  \\ \hline
1 & 1 &	0.0 & True & 2 & 1 & 1 \\ \hline
2 & 0 &	1.0 & True & 3 & 0 & 0 \\ \hline
3 & 1 & 0.0 & True & 4 & 1,1,1 & 1  \\ \hline
4 & 1 & 1.0 & False & 4 &  & 2 \\ \hline
5 & 1 & 1.0 & False & 4 &  & 3 \\ \hline
6 & 0 &	1.0 & True & 5 & 0 & 0 \\ \hline
7 & 1 &	0.0 & True & 6 & 1,1 & 1 \\ \hline
8 & 1 &	1.0 & False & 6 &  & 2 \\ \hline
\end{array}

Daten erweitern

Rollende Berechnung basierend auf Wert statt Anzahl: Zwischenablage:

df = pd.DataFrame({'RollBasis':[1,1,1,2,3,5,8,10,12,13],
                   'ToRoll':[1,4,-5,2,-4,-2,0,-13,-2,-5]})

def f(x):
    ser = df.ToRoll[(df.RollBasis >= x) & (df.RollBasis < x+5)]
    return ser.sum()

df['Rolled'] = df.RollBasis.apply(f)
df
0	1	1	-4
1	1	4	-4
2	1	-5	-4
3	2	2	-4
4	3	-4	-6
5	5	-2	-2
6	8	0	-15
7	10	-13	-20
8	12	-2	-7
9	13	-5	-5

** [Code lesen] ** </ font>

RollBasis ToRoll
0 1 1
1 1 4
2 1 -5
3 2 2
4 3 -4
5 5 -2
6 8 0
7 10 -13
8 12 -2
9 13 -5
  • Der Inhalt der Funktion f besteht darin, die Werte von 'ToRoll' in dem Bereich zu summieren, in dem der Wert von 'RollBasis' x oder mehr und x + 5 oder weniger beträgt.

$ x=1 $ $(RollBasis>=1) \& (RollBsis<1+5) \rightarrow sum([1,4,-5,2,-4,-2]) \rightarrow -4 $ $ \vdots $ $x =4 $ $(RollBasis>=4) \& (RollBsis<4+5) \rightarrow sum([-2,0]) \rightarrow -2 $

Gleitender Durchschnitt über das Zeitintervall

df = pd.DataFrame({'B': range(5)})

df.index = [pd.Timestamp('20130101 09:00:00'),
            pd.Timestamp('20130101 09:00:02'),
            pd.Timestamp('20130101 09:00:03'),
            pd.Timestamp('20130101 09:00:05'),
            pd.Timestamp('20130101 09:00:06')]

df
2013-01-01 09:00:00	0
2013-01-01 09:00:02	1
2013-01-01 09:00:03	2
2013-01-01 09:00:05	3
2013-01-01 09:00:06	4

df.rolling(2, min_periods=1).sum()
				B
2013-01-01 09:00:00	0.0
2013-01-01 09:00:02	1.0
2013-01-01 09:00:03	3.0
2013-01-01 09:00:05	5.0
2013-01-01 09:00:06	7.0

df.rolling('2s', min_periods=1).sum()
				B
2013-01-01 09:00:00	0.0
2013-01-01 09:00:02	1.0
2013-01-01 09:00:03	3.0
2013-01-01 09:00:05	3.0
2013-01-01 09:00:06	7.0

** [Code lesen] ** </ font>

# rolling(Fensterbreite,Mindestanzahl von Daten)
df.rolling(2, min_periods=1).sum()
# 0+1=1, 1+2=3, 2+3=5, 3+4=7 In Einheiten von 2 Zeilen
df.rolling('2s', min_periods=1).sum()
# 0+1=1, 1+2=3, 3+0=3, 3+4=7
#Wenn Sie die Zeitreihendaten in 2-Minuten-Intervallen betrachten und die Summe nehmen
df.resample('2s').sum()
		B
2013-01-01 09:00:00	0
2013-01-01 09:00:02	3
2013-01-01 09:00:04	3
2013-01-01 09:00:06	4

Berechnen Sie den kumulierten Durchschnitt aus der Summe der Zeitreiheneinheiten mit der Rollfunktion

df = pd.DataFrame({'enddate':pd.to_datetime(['2019-03-01','2019-03-01','2019-03-01','2019-03-02','2019-03-02','2019-03-02','2019-03-03','2019-03-03','2019-03-04']),
                   'bloom':[0.342, 0.235, 0.456, 0.389, 0.453, 0.367, 0.369, 0.428, 0.55],
                   'unbloom':[0.658, 0.765, 0.544, 0.611, 0.547, 0.633, 0.631, 0.572, 0.45]})

Aufteilen

Erstellen Sie eine Liste von Datenrahmen und teilen Sie sie basierend auf den in der Zeile enthaltenen Werten auf.

In [146]: d df = pd.DataFrame(data={'Case': ['A', 'A', 'A', 'B', 'A', 'A', 'B', 'A', 'A'],
                         'Data': np.random.randint(10,50,(9,))})

In [147]: dfs = list(zip(*df.groupby((1 * (df['Case'] == 'B')).cumsum()
                         .rolling(window=3, min_periods=1).median())))[-1]

In [148]: dfs[0]
Out[148]: 
  Case      Data
0	A	24
1	A	34
2	A	33
3	B	11
In [149]: dfs[1]
Out[149]: 
  Case      Data
4	A	31
5	A	35
6	B	13

In [150]: dfs[2]
Out[150]: 
Case	Data
7	A	17
8	A	33

** [Code lesen] ** </ font>

Case Data
0 A 24
1 A 34
2 A 33
3 B 11
4 A 31
5 A 35
6 B 13
7 A 17
8 A 33
dfs = list(zip(*df.groupby((1 * (df['Case'] == 'B')).cumsum().rolling(window=3, min_periods=1).median())))[-1]
  • Ich werde diesen einen Liner zerlegen.
# 'Case'Die Spalte ist'B'Ist auf 1 gesetzt
1 * (df['Case'] == 'B')
>
0    0
1    0
2    0
3    1
4    0
5    0
6    1
7    0
8    0
Name: Case, dtype: int64
#Nehmen Sie kumulativ
1 * (df['Case'] == 'B').cumsum()
>
0    0
1    0
2    0
3    1
4    1
5    1
6    2
7    2
8    2
Name: Case, dtype: int64
#Nehmen Sie den Medianwert in Einheiten von 3 Zeilen
(1 * (df['Case'] == 'B')).cumsum().rolling(window=3, min_periods=1).median()
>
0    0.0
1    0.0
2    0.0
3    0.0
4    1.0
5    1.0
6    1.0
7    2.0
8    2.0
Name: Case, dtype: float64
#Nachdem wir im vorherigen Prozess einen Referenzwert für die Gruppierung haben, werden wir ihn extrahieren. Erweitern und listen Sie die resultierenden Gruppenobjekte auf.
tmp2 = list(zip(*df.groupby((1 * (df['Case'] == 'B')).cumsum().rolling(window=3, min_periods=1).median())))
>
[(0.0, 1.0, 2.0), (  Case  Data
  0    A    24
  1    A    34
  2    A    33
  3    B    11,   Case  Data
  4    A    31
  5    A    35
  6    B    13,   Case  Data
  7    A    17
  8    A    33)]
#Wenn Sie das erhaltene Gruppenobjekt nicht erweitern, lautet der Inhalt wie folgt: Entpacken Sie ihn(*)Sie können den Unterschied mit sehen.
tmp = list(zip(df.groupby((1 * (df['Case'] == 'B')).cumsum().rolling(window=3, min_periods=1).median())))
>
[((0.0,   Case  Data
   0    A    24
   1    A    34
   2    A    33
   3    B    11),), ((1.0,   Case  Data
   4    A    31
   5    A    35
   6    B    13),), ((2.0,   Case  Data
   7    A    17
   8    A    33),)]
#dfs ist eine Liste[(0.0,1.0,2.0),(Die folgenden Daten)]Damit[-1]Um das erste Element vom Ende zu bekommen.
dfs = list(zip(*df.groupby((1 * (df['Case'] == 'B')).cumsum().rolling(window=3, min_periods=1).median())))[-1]
>
(  Case  Data
 0    A    24
 1    A    34
 2    A    33
 3    B    11,   Case  Data
 4    A    31
 5    A    35
 6    B    13,   Case  Data
 7    A    17
 8    A    33)

Pivot

Teilsumme und Zwischensumme

In [151]: df = pd.DataFrame(data={'Province': ['ON', 'QC', 'BC', 'AL', 'AL', 'MN', 'ON'],
                                  'City': ['Toronto', 'Montreal', 'Vancouver',
                                  'Calgary', 'Edmonton', 'Winnipeg', 'Windsor'],
                                  'Sales': [13, 6, 16, 8, 4, 3, 1]})


In [152]: table = pd.pivot_table(df, values=['Sales'], index=['Province'],
                                 columns=['City'], aggfunc=np.sum, margins=True)

In [153]: table.stack('City')
Out[153]: 
                    Sales
Province City            
AL       All         12.0
         Calgary      8.0
         Edmonton     4.0
BC       All         16.0
         Vancouver   16.0
...                   ...
All      Montreal     6.0
         Toronto     13.0
         Vancouver   16.0
         Windsor      1.0
         Winnipeg     3.0

[20 rows x 1 columns]

** [Code lesen] ** </ font> Der angegebene Datenrahmen enthält den folgenden Inhalt.

Province City Sales
0 ON Toronto 13
1 QC Montreal 6
2 BC Vancouver 16
3 AL Calgary 8
4 AL Edmonton 4
5 MN Winnipeg 3
6 ON Windsor 1
# pivot_Mit der Tabellenfunktion in das Tabellenformat konvertieren.
table = pd.pivot_table(df, values=['Sales'], index=['Province'], columns=['City'], aggfunc=np.sum, margins=True)
Sales
Province Calgary Edmonton Montreal Toronto Vancouver Windsor
AL 8 4 nan nan nan nan
BC nan nan nan nan 16 nan
MN nan nan nan nan nan nan
ON nan nan nan 13 nan 1
QC nan nan 6 nan nan nan
All 8 4 6 13 16 1

Die Stapelfunktion transformiert die Daten in Spaltenrichtung in Zeilenrichtung.

R Frequenztabelle wie Plyr

In [154]: grades = [48, 99, 75, 80, 42, 80, 72, 68, 36, 78]

In [155]: df = pd.DataFrame({'ID': ["x%d" % r for r in range(10)],
                             'Gender': ['F', 'M', 'F', 'M', 'F',
                                        'M', 'F', 'M', 'M', 'M'],
                            'ExamYear': ['2007', '2007', '2007', '2008', '2008',
                                         '2008', '2008', '2009', '2009', '2009'],
                            'Class': ['algebra', 'stats', 'bio', 'algebra',
                                      'algebra', 'stats', 'stats', 'algebra', 
                                      'bio', 'bio'],
                            'Participated': ['yes', 'yes', 'yes', 'yes', 'no',
                                             'yes', 'yes', 'yes', 'yes', 'yes'],
                            'Passed': ['yes' if x > 50 else 'no' for x in grades],
                            'Employed': [True, True, True, False,
                                         False, False, False, True, True, False],
                            'Grade': grades})

In [156]: df.groupby('ExamYear').agg({'Participated': lambda x: x.value_counts()['yes'],
                                      'Passed': lambda x: sum(x == 'yes'),
                                      'Employed': lambda x: sum(x),
                                      'Grade': lambda x: sum(x) / len(x)})
Out[156]: 
          Participated  Passed  Employed      Grade
ExamYear                                           
2007                 3       2         3  74.000000
2008                 3       3         0  68.500000
2009                 3       2         2  60.666667

** [Code lesen] ** </ font>

ID Gender ExamYear Class Participated Passed Employed Grade
0 x0 F 2007 algebra yes no True 48
1 x1 M 2007 stats yes yes True 99
2 x2 F 2007 bio yes yes True 75
3 x3 M 2008 algebra yes yes False 80
4 x4 F 2008 algebra no no False 42
5 x5 M 2008 stats yes yes False 80
6 x6 F 2008 stats yes yes False 72
7 x7 M 2009 algebra yes yes True 68
8 x8 M 2009 bio yes no True 36
9 x9 M 2009 bio yes yes False 78
  • Ich verwende SQL nicht täglich, aber ich habe es in Sqlite3 eingefügt und mit einer SQL-Anweisung überprüft.
select ExamYear,
count(Participated = 'yes' or null) as participated,
count(Passed = 'yes' or null) as passed,
count(Employed = 'True' or null) as employed,
sum(cast(Grade as real))/count(cast(Grade as real)) as grades
from df
group by ExamYear 
;

"2007"	"3"	"2"	"3"	"74.0"
"2008"	"3"	"3"	"0"	"68.5"
"2009"	"3"	"2"	"2"	"60.6666666666667"

So erstellen Sie eine Jahr-Monat-Kreuztabelle:

In [157]: df = pd.DataFrame({'value': np.random.randn(36)},
                             index=pd.date_range('2011-01-01', freq='M', periods=36))

In [158]: pd.pivot_table(df, index=df.index.month, columns=df.index.year,
                         values='value', aggfunc='sum')

Out[158]: 
        2011      2012      2013
1  -1.039268 -0.968914  2.565646
2  -0.370647 -1.294524  1.431256
3  -1.157892  0.413738  1.340309
4  -1.344312  0.276662 -1.170299
5   0.844885 -0.472035 -0.226169
6   1.075770 -0.013960  0.410835
7  -0.109050 -0.362543  0.813850
8   1.643563 -0.006154  0.132003
9  -1.469388 -0.923061 -0.827317
10  0.357021  0.895717 -0.076467
11 -0.674600  0.805244 -1.187678
12 -1.776904 -1.206412  1.130127

** [Code lesen] ** </ font>

# 1-Es gab Aufzeichnungen von Indizes, von denen ich dachte, dass sie nur 12 waren. Das Jahr ist das gleiche. Einzigartig()Und aggregiert.
df.index.month
>
Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12,  1,  2,  3,  4,  5,
             6,  7,  8,  9, 10, 11, 12,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
            11, 12],
           dtype='int64')
>
df.index.year
>
Int64Index([2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011,
            2011, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012, 2012,
            2012, 2012, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013,
            2013, 2013, 2013],
           dtype='int64')

pivot_table wurde kleiner, wenn ich dachte, es würde Speicher wie Excel verschlingen. Wenn ich darüber nachdachte, war es natürlich, weil ich die Daten vor der Konvertierung nicht hatte.

df = pd.DataFrame({'value': np.random.randn(36)},
                  index=pd.date_range('2011-01-01', freq='M', periods=36))
df.__sizeof__()
576
df_pivot = pd.pivot_table(df, index=df.index.month, columns=df.index.year, values='value', aggfunc='sum')
df_pivot.__sizeof__()
384

Anwenden

Wenden Sie Rolling an, um eingebettete Listen in MultiIndex-Frames zu organisieren und zu konvertieren

In [159]: df = pd.DataFrame(data={'A': [[2, 4, 8, 16], [100, 200], [10, 20, 30]],
                           'B': [['a', 'b', 'c'], ['jj', 'kk'], ['ccc']]},
                           index=['I', 'II', 'III'])

In [160]: def SeriesFromSubList(aList):
              return pd.Series(aList)

In [161]: df_orgz = pd.concat({ind: row.apply(SeriesFromSubList)
                               for ind, row in df.iterrows()})

In [162]: df_orgz
Out[162]: 
         0    1    2     3
I   A    2    4    8  16.0
    B    a    b    c   NaN
II  A  100  200  NaN   NaN
    B   jj   kk  NaN   NaN
III A   10   20   30   NaN
    B  ccc  NaN  NaN   NaN

** [Code lesen] ** </ font>

A B
I [2, 4, 8, 16] [a, b, c]
II [100, 200] [jj, kk]
III [10, 20, 30] [ccc]

Holen Sie sich die Liste in die Zelle des erstellten Datenrahmens, konvertieren Sie sie in pd.Series und kombinieren Sie sie. NaN wird zu den Daten hinzugefügt, die kleiner als die maximale Spalte sind.

for ind, row in df.iterrows():
    print('ind:'+str(ind))
    print(row)
    r = row.apply(SeriesFromSubList)
    print(r)
>
ind:I
A    [2, 4, 8, 16]
B        [a, b, c]
Name: I, dtype: object
   0  1  2     3
A  2  4  8  16.0
B  a  b  c   NaN
ind:II
A    [100, 200]
B      [jj, kk]
Name: II, dtype: object
     0    1
A  100  200
B   jj   kk
ind:III
A    [10, 20, 30]
B           [ccc]
Name: III, dtype: object
     0     1     2
A   10  20.0  30.0
B  ccc   NaN   NaN

Konvertieren Sie das von pd.Series konvertierte Ergebnis erneut in den Skalarwert in das pd.Series-Format und wenden Sie die Rolling-Funktion auf mehrere Spalten an

In [163]: df = pd.DataFrame(data=np.random.randn(2000, 2) / 10000,
                            index=pd.date_range('2001-01-01', periods=2000),
                            columns=['A', 'B'])
In [164]: df
Out[164]: 
                   A         B
2001-01-01 -0.000144 -0.000141
2001-01-02  0.000161  0.000102
2001-01-03  0.000057  0.000088
2001-01-04 -0.000221  0.000097
2001-01-05 -0.000201 -0.000041
...              ...       ...
2006-06-19  0.000040 -0.000235
2006-06-20 -0.000123 -0.000021
2006-06-21 -0.000113  0.000114
2006-06-22  0.000136  0.000109
2006-06-23  0.000027  0.000030
[2000 rows x 2 columns]

In [165]: def gm(df, const):
              v = ((((df['A'] + df['B']) + 1).cumprod()) - 1) * const
              return v.iloc[-1]


In [166]: s = pd.Series({df.index[i]: gm(df.iloc[i:min(i + 51, len(df) - 1)], 5)
                         for i in range(len(df) - 50)})

In [167]: s
Out[167]: 
2001-01-01    0.000930
2001-01-02    0.002615
2001-01-03    0.001281
2001-01-04    0.001117
2001-01-05    0.002772
                ...   
2006-04-30    0.003296
2006-05-01    0.002629
2006-05-02    0.002081
2006-05-03    0.004247
2006-05-04    0.003928
Length: 1950, dtype: float64

** [Code lesen] ** </ font>

#In diesem Beispiel werden die Daten alle 50 Tage extrahiert.
#Erhalten Sie den Rückgabewert, indem Sie diese gm-Funktion auf das Extraktionsergebnis anwenden.
#Erstes Datum und Uhrzeit des Zielzeitraums (in diesem Beispiel'2001-01-1')Ab dem Enddatum und der Endzeit(2006-05-04)Speichern Sie Datum und Uhrzeit und geben Sie den Wert bis zurück
>
#Funktion der gm-Funktion:(df['A']+df['B']+1)Berechnen Sie das kumulative Produkt von und subtrahieren Sie 1 und multiplizieren Sie das Ergebnis mit einer Konstanten: 5.
gm(df.iloc[0:min(0 + 51, len(df) - 1)], 5)
0.000930

Wenden Sie das Rollen auf mehrere Spalten an, wenn die Funktion skalar ist

In [168]: rng = pd.date_range(start='2014-01-01', periods=100)

In [169]: df = pd.DataFrame({'Open': np.random.randn(len(rng)),
                             'Close': np.random.randn(len(rng)),
                             'Volume': np.random.randint(100, 2000, len(rng))},
                            index=rng)
In [170]: df
Out[170]: 
                Open     Close  Volume
2014-01-01 -1.611353 -0.492885    1219
2014-01-02 -3.000951  0.445794    1054
2014-01-03 -0.138359 -0.076081    1381
2014-01-04  0.301568  1.198259    1253
2014-01-05  0.276381 -0.669831    1728
...              ...       ...     ...
2014-04-06 -0.040338  0.937843    1188
2014-04-07  0.359661 -0.285908    1864
2014-04-08  0.060978  1.714814     941
2014-04-09  1.759055 -0.455942    1065
2014-04-10  0.138185 -1.147008    1453
[100 rows x 3 columns]

In [171]: def vwap(bars):
              return ((bars.Close * bars.Volume).sum() / bars.Volume.sum())
 

In [172]: window = 5

In [173]: s = pd.concat([(pd.Series(vwap(df.iloc[i:i + window]),
                          index=[df.index[i + window]]))
                         for i in range(len(df) - window)])

In [174]: s.round(2)
Out[174]: 
2014-01-06    0.02
2014-01-07    0.11
2014-01-08    0.10
2014-01-09    0.07
2014-01-10   -0.29
              ... 
2014-04-06   -0.63
2014-04-07   -0.02
2014-04-08   -0.03
2014-04-09    0.34
2014-04-10    0.29
Length: 95, dtype: float64

** [Code lesen] ** </ font>

  • Wenden Sie die vmap-Funktion auf die mit einem Fensterwert von 5 (alle 5 Tage) aggregierten Daten an und erhalten Sie das Ergebnis.
  • Fügen Sie dem Startdatum den Fensterwert 5 hinzu, um das Datum des Aggregationszeitraums und den Ergebnisdatenrahmen zu erstellen.
[(pd.Series(vwap(df.iloc[i:i + window]),index=[df.index[i + window]])) for i in range(len(df) - window)]
#Erster Abschnitt i=Der Inhalt der Funktion wird als 0 zerlegt und ist wie folgt.
tmp = df.iloc[0:0 + window]
(tmp.Close*tmp.Volume).sum()
tmp.Volume.sum()
(tmp.Close*tmp.Volume).sum() / tmp.Volume.sum()
0.02

Zeitreihe: Zwischenablage:

Zeitintervall

# indexer_between_time(start, end)
rng = pd.date_range('1/1/2000', periods=24, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
2000-01-01 00:00:00    1.298558
2000-01-01 01:00:00    0.333122
2000-01-01 02:00:00   -0.034170
2000-01-01 03:00:00   -2.396508
2000-01-01 04:00:00   -0.608591
2000-01-01 05:00:00    1.710535
2000-01-01 06:00:00   -0.657193
2000-01-01 07:00:00   -1.166563
2000-01-01 08:00:00    1.768663
2000-01-01 09:00:00    1.395805
2000-01-01 10:00:00   -0.111062
2000-01-01 11:00:00    0.840320
2000-01-01 12:00:00    0.129081
2000-01-01 13:00:00   -1.604446
2000-01-01 14:00:00   -1.257967
2000-01-01 15:00:00   -0.384715
2000-01-01 16:00:00   -1.185482
2000-01-01 17:00:00    2.222229
2000-01-01 18:00:00   -0.917695
2000-01-01 19:00:00   -2.158507
2000-01-01 20:00:00   -0.487902
2000-01-01 21:00:00   -1.667997
2000-01-01 22:00:00    0.202186
2000-01-01 23:00:00   -0.710070
Freq: H, dtype: float64
>
#Beim Extrahieren von 10:00 bis 14:00 Uhr
ts.iloc[ts.index.indexer_between_time(datetime.time(10), datetime.time(14))]
2000-01-01 10:00:00   -0.111062
2000-01-01 11:00:00    0.840320
2000-01-01 12:00:00    0.129081
2000-01-01 13:00:00   -1.604446
2000-01-01 14:00:00   -1.257967
Freq: H, dtype: float64

Informationen zu Zeitreihenmasken basierend auf dem Index: Zwischenablage:

index = pd.date_range('2013-1-1',periods=10,freq='15Min')
data = pd.DataFrame(data=[1,2,3,4,5,6,7,8,9,0], columns=['value'], index=index)
data
	value
2013-01-01 00:00:00	1
2013-01-01 00:15:00	2
2013-01-01 00:30:00	3
2013-01-01 00:45:00	4
2013-01-01 01:00:00	5
2013-01-01 01:15:00	6
2013-01-01 01:30:00	7
2013-01-01 01:45:00	8
2013-01-01 02:00:00	9
2013-01-01 02:15:00	0

data.index.indexer_between_time('01:15', '02:00')
array([5, 6, 7, 8])

data.iloc[data.index.indexer_between_time('1:15', '02:00')]
013-01-01 01:15:00	6
2013-01-01 01:30:00	7
2013-01-01 01:45:00	8
2013-01-01 02:00:00	9

** [Code lesen] ** </ font>

#Wenn die Zeit umgekehrt angegeben wird, wird die auszuschließende Periode extrahiert.
data.iloc[data.index.indexer_between_time('02:00', '1:15')]
	value
2013-01-01 00:00:00	1
2013-01-01 00:15:00	2
2013-01-01 00:30:00	3
2013-01-01 00:45:00	4
2013-01-01 01:00:00	5
2013-01-01 01:15:00	6
2013-01-01 02:00:00	9
2013-01-01 02:15:00	0

Schließen Sie Wochenenden aus und erstellen Sie einen Datums- und Zeitbereich, der nur bestimmte Zeiten enthält: Zwischenablage:

rng = pd.date_range('20130101 09:00','20130110 16:00',freq='30T')

DatetimeIndex(['2013-01-01 09:00:00', '2013-01-01 09:30:00',
               '2013-01-01 10:00:00', '2013-01-01 10:30:00',
               '2013-01-01 11:00:00', '2013-01-01 11:30:00',
               '2013-01-01 12:00:00', '2013-01-01 12:30:00',
               '2013-01-01 13:00:00', '2013-01-01 13:30:00',
               ...
               '2013-01-10 11:30:00', '2013-01-10 12:00:00',
               '2013-01-10 12:30:00', '2013-01-10 13:00:00',
               '2013-01-10 13:30:00', '2013-01-10 14:00:00',
               '2013-01-10 14:30:00', '2013-01-10 15:00:00',
               '2013-01-10 15:30:00', '2013-01-10 16:00:00'],
              dtype='datetime64[ns]', length=447, freq='30T')

#Schließen Sie unnötige Zeit aus
rng = rng.take(rng.indexer_between_time('09:30','16:00'))

DatetimeIndex(['2013-01-01 09:30:00', '2013-01-01 10:00:00',
               '2013-01-01 10:30:00', '2013-01-01 11:00:00',
               '2013-01-01 11:30:00', '2013-01-01 12:00:00',
               '2013-01-01 12:30:00', '2013-01-01 13:00:00',
               '2013-01-01 13:30:00', '2013-01-01 14:00:00',
               ...
               '2013-01-10 11:30:00', '2013-01-10 12:00:00',
               '2013-01-10 12:30:00', '2013-01-10 13:00:00',
               '2013-01-10 13:30:00', '2013-01-10 14:00:00',
               '2013-01-10 14:30:00', '2013-01-10 15:00:00',
               '2013-01-10 15:30:00', '2013-01-10 16:00:00'],
              dtype='datetime64[ns]', length=140, freq=None)

#Nur an Wochentagen
rng = rng[rng.weekday<5]
DatetimeIndex(['2013-01-01 09:30:00', '2013-01-01 10:00:00',
               '2013-01-01 10:30:00', '2013-01-01 11:00:00',
               '2013-01-01 11:30:00', '2013-01-01 12:00:00',
               '2013-01-01 12:30:00', '2013-01-01 13:00:00',
               '2013-01-01 13:30:00', '2013-01-01 14:00:00',
               ...
               '2013-01-10 11:30:00', '2013-01-10 12:00:00',
               '2013-01-10 12:30:00', '2013-01-10 13:00:00',
               '2013-01-10 13:30:00', '2013-01-10 14:00:00',
               '2013-01-10 14:30:00', '2013-01-10 15:00:00',
               '2013-01-10 15:30:00', '2013-01-10 16:00:00'],
              dtype='datetime64[ns]', length=112, freq=None)

Suchen Sie eine Matrix in einem Datenrahmen

Der folgende Code enthält einige numerische Änderungen von stackoverflow.com.

date_item = pd.to_datetime(['2019/1/4','2019/1/7','2019/1/7','2019/1/8','2019/1/9','2019/1/10','2019/1/10','2019/1/11','2019/1/15','2019/1/16','2019/1/16','2019/1/17','2019/1/18'])

DatetimeIndex(['2019-01-04', '2019-01-07', '2019-01-07', '2019-01-08',
               '2019-01-09', '2019-01-10', '2019-01-10', '2019-01-11',
               '2019-01-15', '2019-01-16', '2019-01-16', '2019-01-17',
               '2019-01-18'],
              dtype='datetime64[ns]', freq=None)

orders = pd.DataFrame({'Date':date_item,
                      'by':['buy','buy','sell','buy','sell','buy','buy','sell','buy','sell','buy','sell','buy'],
                      'cnt':[100, 200, 100, 50, 100, 100, 200, 50, 100, 50, 50, 50, 100],
                      'code':['1720','8086','4967','8086','8086','4967','1720','4967','1720','1720','8086','4967','8086'],
                      'prices':[1008, 1344, 7530, 1347, 1373, 7120, 1008, 7120, 995, 986, 1417, 6990, 1445]})

Prices

1720 8086 4967
2019-01-04 1008 1311 7370
2019-01-07 1033 1344 7530
2019-01-08 1025 1347 7130
2019-01-09 1034 1373 7460
2019-01-10 1008 1364 7120
2019-01-11 1000 1391 7030
2019-01-15 995 1400 6950
2019-01-16 986 1417 6920
2019-01-17 1002 1419 6990
2019-01-18 1010 1445 7050

Orders

Date by cnt code prices
0 2019-01-04 buy 100 1720 1008
1 2019-01-07 buy 200 8086 1344
2 2019-01-07 sell 100 4967 7530
3 2019-01-08 buy 50 8086 1347
4 2019-01-09 sell 100 8086 1373
5 2019-01-10 buy 100 4967 7120
6 2019-01-10 buy 200 1720 1008
7 2019-01-11 sell 50 4967 7120
8 2019-01-15 buy 100 1720 995
9 2019-01-16 sell 50 1720 986
10 2019-01-16 buy 50 8086 1417
11 2019-01-17 sell 50 4967 6990
12 2019-01-18 buy 100 8086 1445
lookup(row_labels, col_labels)
prices.lookup(orders.Date, orders.code)
array([1008, 1344, 7530, 1347, 1373, 7120, 1008, 7030,  995,  986, 1417,
       6990, 1445])

Konvertiert einen Datenrahmen, der aus Spalten in Stunden und Zeilen in Tagen besteht, in eine fortlaufende Zeilenfolge in chronologischem Format. : Zwischenablage:

Der folgende Code enthält einige numerische Änderungen gegenüber dem auf stackoverflow.com veröffentlichten Inhalt.

df = pd.DataFrame({'Date':['2020-01-01', '2020-01-02'],'h1':[23,45],'h2':[18,17],'h3':[11,16],'h4':[29,31],'h24':[45,55]})

	Date		h1	h2	h3	h4	h24
0	2020-01-01	23	18	11	29	45
1	2020-01-02	45	17	16	31	55

#In das folgende Format konvertieren
	Date	value
0	2020-01-01	23
2	2020-01-01	18
4	2020-01-01	11
6	2020-01-01	29
8	2020-01-01	45
1	2020-01-02	45
3	2020-01-02	17
5	2020-01-02	16
7	2020-01-02	31
9	2020-01-02	55

** [Code lesen] ** </ font>

#Konvertieren Sie von horizontalem zu vertikalem Halten
df = pd.melt(df, id_vars=['Date'])
>
	Date	variable	value
0	2020-01-01	h1	23
1	2020-01-02	h1	45
2	2020-01-01	h2	18
3	2020-01-02	h2	17
4	2020-01-01	h3	11
5	2020-01-02	h3	16
6	2020-01-01	h4	29
7	2020-01-02	h4	31
8	2020-01-01	h24	45
9	2020-01-02	h24	55
#Spalte umbenennen
df = df.rename(columns={'variable': 'hour'})
>
	Date	hour	value
0	2020-01-01	h1	23
1	2020-01-02	h1	45
2	2020-01-01	h2	18
3	2020-01-02	h2	17
4	2020-01-01	h3	11
5	2020-01-02	h3	16
6	2020-01-01	h4	29
7	2020-01-02	h4	31
8	2020-01-01	h24	45
9	2020-01-02	h24	55
#der Stundenspalte'h'Entfernung
df['hour'] = df['hour'].apply(lambda x: int(x.lstrip('h'))-1)
>
	Date	hour	value
0	2020-01-01	0	23
1	2020-01-02	0	45
2	2020-01-01	1	18
3	2020-01-02	1	17
4	2020-01-01	2	11
5	2020-01-02	2	16
6	2020-01-01	3	29
7	2020-01-02	3	31
8	2020-01-01	23	45
9	2020-01-02	23	55
#Erstellen von Spaltendaten, die Tag und Uhrzeit kombinieren
combined = df.apply(lambda x: pd.to_datetime(x['Date'], dayfirst=True) + datetime.timedelta(hours=int(x['hour'])), axis=1)
>
0   2020-01-01 00:00:00
1   2020-01-02 00:00:00
2   2020-01-01 01:00:00
3   2020-01-02 01:00:00
4   2020-01-01 02:00:00
5   2020-01-02 02:00:00
6   2020-01-01 03:00:00
7   2020-01-02 03:00:00
8   2020-01-01 23:00:00
9   2020-01-02 23:00:00
dtype: datetime64[ns]
# 'Date'Spaltendaten ersetzen
df['Date'] = combined
	Date  	  	hour  value 
 0  2020-01-01 00:00:00   0  23 
 1  2020-01-02 00:00:00   0  45 
 2  2020-01-01 01:00:00   1  18 
 3  2020-01-02 01:00:00   1  17 
 4  2020-01-01 02:00:00   2  11 
 5  2020-01-02 02:00:00   2  16 
 6  2020-01-01 03:00:00   3  29 
 7  2020-01-02 03:00:00   3  31 
 8  2020-01-01 23:00:00  23  45 
 9  2020-01-02 23:00:00  23  55 
# 'hour'Spalte löschen
del df['hour']
>
#Nach Datum sortieren
df = df.sort_values("Date")
>
Date	value
0	2020-01-01	23
2	2020-01-01	18
4	2020-01-01	11
6	2020-01-01	29
8	2020-01-01	45
1	2020-01-02	45
3	2020-01-02	17
5	2020-01-02	16
7	2020-01-02	31
9	2020-01-02	55

Behandlung von Duplikaten beim Neuindizieren einer Zeitreihe auf eine bestimmte Häufigkeit: Zwischenablage:

#A Erstellen von Zeitreihendaten(Datum (und Uhrzeit+Millisekunde[Dummy-Daten])->100 Fälle
intervals = np.random.randint(0,1000,size=100).cumsum()
df = pd.DataFrame({'time':[pd.Timestamp('20140101') + pd.offsets.Milli(i) for i in intervals ],
                'value' : np.random.randn(len(intervals))})

# df
			time	value
0	2014-01-01 00:00:00.499	0.567731
1	2014-01-01 00:00:01.232	-0.751466
2	2014-01-01 00:00:01.238	1.250118
3	2014-01-01 00:00:01.533	0.588161
4	2014-01-01 00:00:02.210	0.996543
...	...	...
95	2014-01-01 00:00:49.216	0.753233
96	2014-01-01 00:00:49.719	0.849922
97	2014-01-01 00:00:49.732	1.171001
98	2014-01-01 00:00:50.723	-0.443835
99	2014-01-01 00:00:51.389	-0.830960
100 rows × 2 columns

#B Zeitreihendatenindex(Datum (und Uhrzeit+1 Minute Einheit)->3601 Fälle
pd.date_range('20140101 00:00:00','20140101 01:00:00',freq='s')

DatetimeIndex(['2014-01-01 00:00:00', '2014-01-01 00:00:01',
               '2014-01-01 00:00:02', '2014-01-01 00:00:03',
               '2014-01-01 00:00:04', '2014-01-01 00:00:05',
               '2014-01-01 00:00:06', '2014-01-01 00:00:07',
               '2014-01-01 00:00:08', '2014-01-01 00:00:09',
               ...
               '2014-01-01 00:59:51', '2014-01-01 00:59:52',
               '2014-01-01 00:59:53', '2014-01-01 00:59:54',
               '2014-01-01 00:59:55', '2014-01-01 00:59:56',
               '2014-01-01 00:59:57', '2014-01-01 00:59:58',
               '2014-01-01 00:59:59', '2014-01-01 01:00:00'],
              dtype='datetime64[ns]', length=3601, freq='S')

#Ergebnis
2014-01-01 00:00:00.000	NaN
2014-01-01 00:00:00.499	0.567731
2014-01-01 00:00:01.000	0.567731  <-Ursprünglich NaN
2014-01-01 00:00:01.232	-0.751466
2014-01-01 00:00:01.238	1.250118
2014-01-01 00:00:01.533	0.588161
2014-01-01 00:00:02.000	0.588161  <-Ursprünglich NaN
2014-01-01 00:00:02.210	0.996543
2014-01-01 00:00:02.652	0.322535
2014-01-01 00:00:03.000	0.322535  <-Ursprünglich NaN

** [Code lesen] ** </ font>

  • Es ist eine sehr verwirrende Überschrift, aber es geht darum, den A-Zeitreihendaten eine weitere B-Zeitreihe (beide innerhalb derselben Zeitachse) hinzuzufügen und ffill (den Zustand, in dem die Datenzeichenfolge fehlt). ) Ist eine Technik zum Ausfüllen der Zahlen.
intervals
>
array([  499,  1232,  1238,  1533,  2210,  2652,  3512,  3598,  3663,
        3688,  3758,  3969,  4960,  5933,  6211,  7040,  7763,  8331,
        9329, 10229, 10436, 10671, 10727, 11695, 12249, 13033, 13867,
       13895, 14809, 15069, 16022, 16484, 16597, 17044, 17060, 17344,
       18124, 18629, 19256, 20022, 20620, 21080, 21148, 21603, 22164,
       22872, 23075, 23566, 24133, 24887, 24996, 25132, 25435, 26047,
       26287, 27168, 27228, 28129, 29118, 29539, 30339, 30465, 31396,
       31805, 32583, 33021, 33854, 34439, 34865, 35207, 35212, 35345,
       35865, 36586, 37325, 37422, 38411, 38986, 39227, 39768, 40316,
       41254, 42162, 42476, 43155, 43971, 44791, 44899, 45770, 46701,
       47568, 47901, 48242, 48720, 48940, 49216, 49719, 49732, 50723,
       51389])
>
#Erstellen Sie eine B-Zeitreihe und kombinieren Sie sie mit einem A-Zeitreihenindex
rng = pd.date_range('20140101 00:00:00','20140101 01:00:00', freq='s')
new_range = pd.DatetimeIndex(np.append(rng, pd.Index(df.time)))
  • In den auf stackoverflow.com veröffentlichten Inhalten handelt es sich um A-Zeitreihen + B-Zeitreihen, es tritt jedoch ein Fehler auf.
  • Ich habe es nachgeschlagen und konnte es mit DatetimeIndex (np.append (A, B)) verarbeiten.
#Eine Zeitreihe + B Zeitreihe bleibt erhalten, also nach Zeitreihen sortieren
new_range = new_range.sort_values() 
# 'time'Indizieren und Wechseln zu einem neuen kombinierten Index
df.set_index('time').reindex(new_range).head()
>
2014-01-01 00:00:00.000	NaN
2014-01-01 00:00:00.499	0.567731
2014-01-01 00:00:01.000	NaN
2014-01-01 00:00:01.232	-0.751466
2014-01-01 00:00:01.238	1.250118
>
# ffill()Aktualisieren Sie den Wert mit
df.set_index('time').reindex(new_range).ffill().head(10)
>
		value
2014-01-01 00:00:00.000	NaN
2014-01-01 00:00:00.499	0.567731
2014-01-01 00:00:01.000	0.567731
2014-01-01 00:00:01.232	-0.751466
2014-01-01 00:00:01.238	1.250118
2014-01-01 00:00:01.533	0.588161
2014-01-01 00:00:02.000	0.588161
2014-01-01 00:00:02.210	0.996543
2014-01-01 00:00:02.652	0.322535
2014-01-01 00:00:03.000	0.322535

Resampling

Wie dividiere ich einen einzelnen Wert in einem Datenrahmen durch den monatlichen Durchschnitt? : Zwischenablage :: thumbsup:

df = pd.DataFrame(np.random.randint(1000, 1200, (12,1)), columns=['value'],
                  index = pd.date_range('2014-01-01 00:15:00', freq='15min', periods=12))

df
		value 
 2014-01-01 00:15:00  1122 
 2014-01-01 00:30:00  1132 
 2014-01-01 00:45:00  1091 
 2014-01-01 01:00:00  1188 
 2014-01-01 01:15:00  1156 
 2014-01-01 01:30:00  1089 
 2014-01-01 01:45:00  1148 
 2014-01-01 02:00:00  1040 
 2014-01-01 02:15:00  1010 
 2014-01-01 02:30:00  1130 
 2014-01-01 02:45:00  1178 
 2014-01-01 03:00:00  1186 

df['normed'] = df.groupby(grouper).transform(lambda x: x / x.mean())

df
			value	normed
Date		
2014-01-01 00:15:00	1122	0.999555
2014-01-01 00:30:00	1132	1.008463
2014-01-01 00:45:00	1091	0.971938
2014-01-01 01:00:00	1188	1.058352
2014-01-01 01:15:00	1156	1.029844
2014-01-01 01:30:00	1089	0.970156
2014-01-01 01:45:00	1148	1.022717
2014-01-01 02:00:00	1040	0.926503
2014-01-01 02:15:00	1010	0.899777
2014-01-01 02:30:00	1130	1.006682
2014-01-01 02:45:00	1178	1.049443
2014-01-01 03:00:00	1186	1.056570

** [Code lesen] ** </ font>

df.index.name = 'Date'
#Verwenden Sie Grouper, um nach einem bestimmten Zyklus oder Intervall zu gruppieren. In diesem Fall ist es ein Monat`freq='M'`Und.
grouper = pd.Grouper(level=0, freq='M')
>
#Wenn Sie in der Gruppeneigenschaft auf den Inhalt des Zackenbarschs verweisen, sehen Sie, dass es sich um eine monatliche Einheit des letzten Tages handelt.
df.groupby(grouper).groups
{Timestamp('2014-01-31 00:00:00', freq='M'): 12}
>
#Die Methode, die ohne Verwendung von Grouper problemlos erforderlich ist, wird veröffentlicht. Das ist praktisch!
df.groupby([df.index.year, df.index.month]).transform(lambda x: x/x.mean())

Gruppierung mit MultiIndex: Zwischenablage:

data = pd.concat([pd.DataFrame([['A']*36, list(pd.date_range('1/1/2011', periods=36, freq='H')), list(np.random.rand(36))], index = ['Group', 'Time', 'Value']).T,
                  pd.DataFrame([['B']*36, list(pd.date_range('1/1/2011', periods=36, freq='H')), list(np.random.rand(36))], index = ['Group', 'Time', 'Value']).T,
                  pd.DataFrame([['C']*36, list(pd.date_range('1/1/2011', periods=36, freq='H')), list(np.random.rand(36))], index = ['Group', 'Time', 'Value']).T],
                  axis = 0).set_index(['Group', 'Time'])

data

			Value
Group	Time	
A	2011-01-01 00:00:00	0.306533
	2011-01-01 01:00:00	0.653431
	2011-01-01 02:00:00	0.0284997
	2011-01-01 03:00:00	0.852406
	2011-01-01 04:00:00	0.856705
...	...	...
C	2011-01-02 07:00:00	0.607041
	2011-01-02 08:00:00	0.291705
	2011-01-02 09:00:00	0.480091
	2011-01-02 10:00:00	0.890153
	2011-01-02 11:00:00	0.628454
108 rows × 1 columns

#Ergebnis
Time        Group
2011-01-01  A        0.497803
            B        0.524934
            C        0.566736
2011-01-02  A        0.442884
            B        0.452267
            C        0.632567
Name: Value, dtype: float64

** [Code lesen] ** </ font>

data['Value'] = data['Value'].astype(float)
#Zwei Schlüssel(Grouper A:Tagsüber, Grouper B:'Group')Gruppieren und nehmen Sie den Durchschnittswert.
daily_counts = data.groupby([pd.Grouper(freq='D', level='Time'), pd.Grouper(level='Group')])['Value'].mean()

Wie können Sie in Ihrer eigenen Periode ein Resample durchführen?

dtrange = pd.date_range(datetime.datetime(2013,1,1), datetime.datetime(2013,2,20))
df = pd.DataFrame({'p1': np.random.rand(len(dtrange)) + 5,
                   'p2': np.random.rand(len(dtrange)) + 10},
                 index=dtrange)
		p1		p2
2013-01-01	5.428541	10.292222
2013-01-02	5.172898	10.077244
2013-01-03	5.414736	10.587493
2013-01-04	5.235626	10.567700
2013-01-05	5.659100	10.270270
2013-01-06	5.144520	10.033026
2013-01-07	5.340707	10.561371
2013-01-08	5.256909	10.647431
2013-01-09	5.491950	10.036358
2013-01-10	5.869493	10.010417

#Ergebnis
df.groupby(date).mean()
		p1		p2
2013-01-01	5.401448	10.308353
2013-01-11	5.362789	10.463397
2013-01-21	5.531094	10.346834
2013-02-01	5.559112	10.551347
2013-02-11	5.551023	10.451666

** [Code lesen] ** </ font>

#Dieses d erstellt einen Index für den Anfang, die Mitte und das Ende.
d = df.index.day - np.clip((df.index.day - 1) // 10, 0, 2) * 10 - 1
d
Int64Index([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  0,  1,  2,  3,  4,  5,  6,
             7,  8,  9,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10,  0,  1,  2,
             3,  4,  5,  6,  7,  8,  9,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
           dtype='int64')
#Dies erhält das Datum des Index der Daten.
df.index.day
Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
            18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,  1,  2,  3,
             4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20],
           dtype='int64')
#-1, um den Index in Einheiten von 10 Tagen zu erstellen.
df.index.day - 1
Int64Index([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
            17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,  0,  1,  2,
             3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
           dtype='int64')
#Erstellen von Indizes für früh, mittel und spät
(df.index.day - 1) // 10
Int64Index([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
            2, 2, 2, 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1],
           dtype='int64')
# np.clip(a, a_min, a_max, out=None, **kargs)
# np.clip verarbeitet den Wert des Elements innerhalb eines beliebigen Bereichs. 0 hier~Passen Sie in den Bereich bis zu 2
np.clip((df.index.day - 1) // 10, 0, 2)
Int64Index([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2,
            2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
            1, 1, 1, 1, 1, 1, 1],
           dtype='int64')
#Früh:0,Mitte:10,Spät:Umrechnung für 20
np.clip((df.index.day - 1) // 10, 0, 2) * 10
Int64Index([ 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10,
            10, 10, 10, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,  0,  0,  0,
             0,  0,  0,  0,  0,  0,  0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10],
           dtype='int64')
#Überprüfen Sie die Berechnung von d.
tmp = pd.DataFrame({'A':df.index.day.values,
                    'B':np.clip((df.index.day - 1) // 10, 0, 2) * 10},
                  index=np.arange(51))
tmp['Diff'] = tmp['A'] - tmp['B']
tmp.head()
	A	B	Diff
0	1	0	1
1	2	0	2
2	3	0	3
3	4	0	4
4	5	0	5
>
tmp['Diff'] = (tmp['A'] - tmp['B']) - 1
	A	B	Diff
0	1	0	0
1	2	0	1
2	3	0	2
3	4	0	3
4	5	0	4
>
# 2020-01-01,2020-01-11,2020-01-21, 2020-02-01, 2020-02-Erstellen Sie 11 Zeitindizes
#Das Konvertieren von d in das Timedelta-Format und das Subtrahieren von der ursprünglichen Zeitreihe ergibt den Index der saisonalen Daten.
date = df.index.values - np.array(d, dtype='timedelta64[D]')
>
array(['2013-01-01T00:00:00.000000000', '2013-01-01T00:00:00.000000000',
       '2013-01-01T00:00:00.000000000', '2013-01-01T00:00:00.000000000',
       '2013-01-01T00:00:00.000000000', '2013-01-01T00:00:00.000000000',
       '2013-01-01T00:00:00.000000000', '2013-01-01T00:00:00.000000000',
       '2013-01-01T00:00:00.000000000', '2013-01-01T00:00:00.000000000',
       '2013-01-11T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
       '2013-01-11T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
       '2013-01-11T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
       '2013-01-11T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
       '2013-01-11T00:00:00.000000000', '2013-01-11T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-01-21T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-01-21T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-01-21T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-01-21T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-01-21T00:00:00.000000000',
       '2013-01-21T00:00:00.000000000', '2013-02-01T00:00:00.000000000',
       '2013-02-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',
       '2013-02-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',
       '2013-02-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',
       '2013-02-01T00:00:00.000000000', '2013-02-01T00:00:00.000000000',
       '2013-02-01T00:00:00.000000000', '2013-02-11T00:00:00.000000000',
       '2013-02-11T00:00:00.000000000', '2013-02-11T00:00:00.000000000',
       '2013-02-11T00:00:00.000000000', '2013-02-11T00:00:00.000000000',
       '2013-02-11T00:00:00.000000000', '2013-02-11T00:00:00.000000000',
       '2013-02-11T00:00:00.000000000', '2013-02-11T00:00:00.000000000',
       '2013-02-11T00:00:00.000000000'], dtype='datetime64[ns]')
>
#Dies'date'Gruppieren und nehmen Sie den Durchschnitt.
df.groupby(date).mean()
			p1	p2
2013-01-01	5.401448	10.308353
2013-01-11	5.362789	10.463397
2013-01-21	5.531094	10.346834
2013-02-01	5.559112	10.551347
2013-02-11	5.551023	10.451666
  • Erstellen Sie einen DatetimeIndex basierend auf den Kriterien, die Sie aggregieren möchten, und aggregieren Sie basierend auf diesem Index.
  • Dieser Einzeiler war für Anfänger schwierig und reichte aus, um ihn zu zerlegen.

Aggregieren Sie die Handelszeiten, ohne neue Tage hinzuzufügen

#Erstellen Sie mit 1-Minuten-Daten
dates = pd.date_range('2014-01-01','2014-01-11', freq='T')[0:-1]
#Nur an Werktagen
dates = dates[dates.dayofweek < 5]
s = pd.DataFrame(np.random.randn(dates.size), dates)
s
					0
2014-01-01 00:00:00	-2.593328
2014-01-01 00:01:00	0.173850
2014-01-01 00:02:00	0.781819
2014-01-01 00:03:00	0.734917
2014-01-01 00:04:00	-1.323457
...	...
2014-01-10 23:55:00	0.158127
2014-01-10 23:56:00	1.205610
2014-01-10 23:57:00	-0.757652
2014-01-10 23:58:00	0.350570
2014-01-10 23:59:00	0.886426
11520 rows × 1 columns

#Nehmen Sie das Datum und die Uhrzeit des Datenrahmens in Schritten von 30 Minuten erneut auf und nehmen Sie den Durchschnitt
s.groupby(lambda d: d.date()).resample('30min').mean()
						0
2014-01-01	2014-01-01 00:00:00	-0.152332
		2014-01-01 00:30:00	-0.172909
		2014-01-01 01:00:00	0.110629
		2014-01-01 01:30:00	-0.070501
		2014-01-01 02:00:00	0.058135
		...	...	...
2014-01-10	2014-01-10 21:30:00	-0.158843
		2014-01-10 22:00:00	0.204738
		2014-01-10 22:30:00	-0.057380
		2014-01-10 23:00:00	0.212008
		2014-01-10 23:30:00	-0.021065
384 rows × 1 columns

** [Code lesen] ** </ font> In 30-Minuten-Schritten neu abgetastet, Durchschnittswerte berechnet und täglich gruppiert. Anfänglich gab es 14.400 Fälle, die nur an Werktagen extrahiert wurden und zu 11.520 Fällen wurden, die in 30-Minuten-Einheiten zu 384 Fällen zusammengefasst wurden.

Gruppieren Sie die täglichen Daten nach Monat. : Zwischenablage :: thumbsup:

import random
df = pd.DataFrame({'string': [random.choice(('about', 'contact', 'home', 'blog')) for _ in range(120)],
                 'visits':np.random.randint(0,2000, (120,))},
               index = pd.date_range('2001-01-01', freq='1d', periods=120))

re_df = df.groupby('string').resample('M').sum()

			visits
string		
about	2001-01-31	4879
		2001-02-28	6713
		2001-03-31	5747
		2001-04-30	9286
blog	2001-01-31	9164
		2001-02-28	8318
		2001-03-31	4770
		2001-04-30	6571
contact	2001-01-31	6883
		2001-02-28	6177
		2001-03-31	10228
		2001-04-30	3531
home	2001-01-31	5496
		2001-02-28	5261
		2001-03-31	7083
		2001-04-30	11383

** [Code lesen] ** </ font>

  • random.choice ('Zeichenkette A', 'Zeichenkette B', 'Zeichenkette C') Extrahieren Sie die Argumentzeichenfolge nach dem Zufallsprinzip.
  • Gruppieren Sie die Daten nach Klassifizierungsnamen, nehmen Sie sie erneut auf und summieren Sie sie monatlich.

Fügen Sie einer neuen Spalte eine monatliche Komposition hinzu

re_df['ratio'] = re_df.groupby(level=1).transform(lambda x: x / x.sum())
>
				visits	ratio
string			
about	2001-01-31	4879	0.184657
		2001-02-28	6713	0.253617
		2001-03-31	5747	0.206519
		2001-04-30	9286	0.301778
blog	2001-01-31	9164	0.346832
		2001-02-28	8318	0.314254
		2001-03-31	4770	0.171410
		2001-04-30	6571	0.213545
contact	2001-01-31	6883	0.260503
		2001-02-28	6177	0.233367
		2001-03-31	10228	0.367543
		2001-04-30	3531	0.114751
home	2001-01-31	5496	0.208008
		2001-02-28	5261	0.198761
		2001-03-31	7083	0.254528
		2001-04-30	11383	0.369926

Verschmelzen

In [177]: rng = pd.date_range('2000-01-01', periods=6)
In [178]: df1 = pd.DataFrame(np.random.randn(6, 3), index=rng, columns=['A', 'B', 'C'])
In [179]: df2 = df1.copy()
In [180]: df = df1.append(df2, ignore_index=True)

In [181]: df
Out[181]: 
           A         B         C
0  -0.870117 -0.479265 -0.790855
1   0.144817  1.726395 -0.464535
2  -0.821906  1.597605  0.187307
3  -0.128342 -1.511638 -0.289858
4   0.399194 -1.430030 -0.639760
5   1.115116 -2.012600  1.810662
6  -0.870117 -0.479265 -0.790855
7   0.144817  1.726395 -0.464535
8  -0.821906  1.597605  0.187307
9  -0.128342 -1.511638 -0.289858
10  0.399194 -1.430030 -0.639760
11  1.115116 -2.012600  1.810662

** [Code lesen] ** </ font>

  • Erstellen Sie 6 Daten und kombinieren Sie dieselben vertikal mit copy ().
  • Für einige Joins ist möglicherweise "ignore_index = True" erforderlich.

DataFrame-Self-Join

In [182]: df = pd.DataFrame(data={'Area': ['A'] * 5 + ['C'] * 2,
                           'Bins': [110] * 2 + [160] * 3 + [40] * 2,
                           'Test_0': [0, 1, 0, 1, 2, 0, 1],
                           'Data': np.random.randn(7)})

In [183]: df
Out[183]: 
	Area	Bins	Test_0	Data
0	A	110	0	0.632955
1	A	110	1	1.485463
2	A	160	0	-1.193891
3	A	160	1	-0.324484
4	A	160	2	1.293263
5	C	40	0	-0.476979
6	C	40	1	-0.467655

In [184]: df['Test_1'] = df['Test_0'] - 1

In [185]: pd.merge(df, df, left_on=['Bins', 'Area', 'Test_0'],
                   right_on=['Bins', 'Area', 'Test_1'],
                   suffixes=('_L', '_R'))

Out[185]: 
Area	Bins	Test_0_L	Data_L	Test_1_L	Test_0_R	Data_R	Test_1_R
0	A	110	0	0.632955	-1	1	1.485463	0
1	A	160	0	-1.193891	-1	1	-0.324484	0
2	A	160	1	-0.324484	0	2	1.293263	1
3	C	40	0	-0.476979	-1	1	-0.467655	0

** [Code lesen] ** </ font>

# 
df['Test_1'] = df['Test_0'] - 1
>
	Area	Bins	Test_0	Data	Test_1
0	A	110	0	0.632955	-1
1	A	110	1	1.485463	0
2	A	160	0	-1.193891	-1
3	A	160	1	-0.324484	0
4	A	160	2	1.293263	1
5	C	40	0	-0.476979	-1
6	C	40	1	-0.467655	0

####Kombinieren Sie nach wertbasierter Bedingung:clipboard:
Der folgende Code ist Stackoverflow.Ich habe einen Code aus dem Beitrag auf com geändert.

```python
import operator as op

df_a = pd.DataFrame([{"a": 1, "b": 4}, {"a": 2, "b": 5}, {"a": 3, "b": 6}])
df_b = pd.DataFrame([{"c": 2, "d": 7}, {"c": 3, "d": 8}])

binOp   = op.lt
matches = np.where(binOp(df_a.a[:,None],df_b.c.values))

pd.concat([df.ix[idxs].reset_index(drop=True) 
                 for df,idxs in zip([df_a,df_b],matches)], axis=1)
df_a
	a	b
0	1	4
1	2	5
2	3	6
df_b

	c	d
0	2	7
1	3	8
# Ergebnis
	a	b	c	d
0	1	4	2	7
1	1	4	3	8
2	2	5	3	8

[Code lesen]

*ZuerstmachtesBeim Zerlegen

# Überprüfen Sie den Inhalt der Spalten df.a und df.b.
df_a.a[:,None]
array([[1],
       [2],
       [3]])
df_b.c.values
array([2, 3])

*Standardoperator im Funktionsstiloperator.lt(a,b)Ista < bdamit,a < bIst äquivalent zu

op.lt(df_a.a[:,None],df_b.c.values)
array([[ True,  True],
       [False,  True],
       [False, False]])
# Ich könnte es so schreiben, wenn es anders geschrieben wäre
df_a.a[:,None] < df_b.c.values
array([[ True,  True],
       [False,  True],
       [False, False]])
>
# Um diesen Inhalt zu überprüfen
df_a.a[:,None][0] < df_b.c.values[0]
array([ True])
df_a.a[:,None][0] < df_b.c.values[1]
array([ True])
df_a.a[:,None][1] < df_b.c.values[0]
array([False])
df_a.a[:,None][1] < df_b.c.values[1]
array([ True])
df_a.a[:,None][2] < df_b.c.values[0]
array([False])
df_a.a[:,None][2] < df_b.c.values[1]
array([False])
>
# Im Fall von np.where (Bedingung) wird der Index des Elements, das die Bedingung erfüllt, im Tapple-Format zurückgegeben.
np.where([[True, True], [False, True], [False, False]])
(array([0, 0, 1]), array([0, 1, 1]))
>
# Extrahieren Sie mit den Bedingungen, die Sie zuvor in "Übereinstimmungen" erhalten haben.
[df.loc[idxs].reset_index(drop=True) for df,idxs in zip([df_a,df_b],matches)]
[   a  b
 0  1  4
 1  1  4
 2  2  5,    c  d
 0  2  7
 1  3  8
 2  3  8]
>
# Dies ist in horizontaler Richtung verbunden (Achse = 1).
	a	b	c	d
0	1	4	2	7
1	1	4	3	8
2	2	5	3	8

Plotting(Zeichnung)

n [186]: df = pd.DataFrame(
   .....:     {'stratifying_var': np.random.uniform(0, 100, 20),
   .....:      'price': np.random.normal(100, 5, 20)})
   .....: 

In [187]: df['quartiles'] = pd.qcut(
   .....:     df['stratifying_var'],
   .....:     4,
   .....:     labels=['0-25%', '25-50%', '50-75%', '75-100%'])
   .....: 

In [188]: df.boxplot(column='price', by='quartiles')
Out[188]: <matplotlib.axes._subplots.AxesSubplot at 0x7fc66b7f1710>

box_plot.png

[Code lesen]

 pandas.qcut(x, q, labels=None...)
# Teilen Sie x durch die Anzahl der q: bin-Unterteilungen und fügen Sie Beschriftungen hinzu.
df['quartiles'] = pd.qcut(df['stratifying_var'], 4, labels=['0-25%', '25-50%', '50-75%', '75-100%'])
>
	stratifying_var	price	quartiles
0	95.463259	110.468740	75-100%
1	61.567537	105.038334	50-75%
2	93.169189	99.502664	75-100%
3	32.881181	100.462400	25-50%
4	22.735506	95.821731	0-25%
5	85.662861	101.262124	75-100%
6	24.251856	102.351950	0-25%
7	26.323525	91.812003	25-50%
8	6.192982	111.425087	0-25%
9	25.520758	104.666583	25-50%
10	75.505473	104.450480	75-100%
11	30.620504	100.044772	25-50%
12	40.438555	102.697402	50-75%
13	18.171318	102.612876	0-25%
14	57.080747	101.067847	50-75%
15	44.066472	93.410125	50-75%
16	64.131972	103.707151	50-75%
17	33.548572	103.359709	25-50%
18	88.433754	99.416668	75-100%
19	21.660715	91.229785	0-25%

Data IN/Out(Dateneingabe / -ausgabe)

###Lesen Sie mehrere Dateien, um einen einzelnen DataFrame zu erstellen:thumbsup:

# Beispiel A.
n [189]: for i in range(3):
             data = pd.DataFrame(np.random.randn(10, 4))
             data.to_csv('file_{}.csv'.format(i))

In [190]: files = ['file_0.csv', 'file_1.csv', 'file_2.csv']
In [191]: result = pd.concat([pd.read_csv(f) for f in files], ignore_index=True)

# Beispiel B.
In [192]: import glob
In [193]: import os

In [194]: files = glob.glob('file_*.csv')
In [195]: result = pd.concat([pd.read_csv(f) for f in files], ignore_index=True)

[Code lesen]

*In Beispiel A wird eine Beispieldatei in einer Schleife erstellt und die Beispieldatei wird gelesen und kombiniert. *In Beispiel B wird der erstellte Dateiname von der Glob-Funktion gelesen und die Datei wird gelesen und kombiniert.

###Analyse mehrspaltiger Datumskomponenten

In [196]: i = pd.date_range('20000101', periods=10000)

In [197]: df = pd.DataFrame({'year': i.year, 'month': i.month, 'day': i.day})

In [198]: df.head()
Out[198]: 
   year  month  day
0  2000      1    1
1  2000      1    2
2  2000      1    3
3  2000      1    4
4  2000      1    5

In [199]: %timeit pd.to_datetime(df.year * 10000 + df.month * 100 + df.day, format='%Y%m%d')
 ds = df.apply(lambda x: "%04d%02d%02d" % (x['year'],
                                          x['month'], x['day']), axis=1)
ds.head()
 %timeit pd.to_datetime(ds)

9.98 ms +- 235 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
2.91 ms +- 57.5 us per loop (mean +- std. dev. of 7 runs, 100 loops each)

[Code lesen]

# Bei der Berechnung und Erstellung von Zeitreiheninformationen anhand der Werte des erstellten Datenrahmens
df.year * 10000 + df.month * 100 + df.day
>
# Beim Erstellen von Zeitreiheninformationen mit einer Funktion aus den Elementen des erstellten Datenrahmens
 ds = df.apply(lambda x: "%04d%02d%02d" % (x['year'], x['month'], x['day']), axis=1)

Unterschied in den Berechnungskosten?

###Überspringen Sie die Zeile zwischen dem Header und den Daten

In [200]: data = """;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
        ;;;;
         date;Param1;Param2;Param4;Param5
             ;m²;°C;m²;m
        ;;;;
         01.01.1990 00:00;1;1;2;3
         01.01.1990 01:00;5;3;4;5
         01.01.1990 02:00;9;5;6;7
         01.01.1990 03:00;13;7;8;9
         01.01.1990 04:00;17;9;10;11
         01.01.1990 05:00;21;11;12;13
 """

Option 1:Übergeben Sie explizit eine Zeile und überspringen Sie die Zeile

In [201]: from io import StringIO

In [202]: pd.read_csv(StringIO(data), sep=';', skiprows=[11, 12],

Out[202]: 
                     Param1  Param2  Param4  Param5
date                                               
1990-01-01 00:00:00       1       1       2       3
1990-01-01 01:00:00       5       3       4       5
1990-01-01 02:00:00       9       5       6       7
1990-01-01 03:00:00      13       7       8       9
1990-01-01 04:00:00      17       9      10      11
1990-01-01 05:00:00      21      11      12      13

Option 2:Lesen Sie die Spaltennamen und dann die Daten

In [203]: pd.read_csv(StringIO(data), sep=';', header=10, nrows=10).columns
Out[203]: Index(['date', 'Param1', 'Param2', 'Param4', 'Param5'], dtype='object')

In [204]: columns = pd.read_csv(StringIO(data), sep=';', header=10, nrows=10).columns

In [205]: pd.read_csv(StringIO(data), sep=';', index_col=0,
                      header=12, parse_dates=True, names=columns)

Out[205]: 
                     Param1  Param2  Param4  Param5
date                                               
1990-01-01 00:00:00       1       1       2       3
1990-01-01 01:00:00       5       3       4       5
1990-01-01 02:00:00       9       5       6       7
1990-01-01 03:00:00      13       7       8       9
1990-01-01 04:00:00      17       9      10      11
1990-01-01 05:00:00      21      11      12      13

[Code lesen]

Ich denke, dass beides unabhängig von der Größe der Daten nicht vorteilhaft ist. In jedem Fall ist es erforderlich, die Anzahl der zu überspringenden Zeilen und die der Kopfzeile entsprechende Zeile zu ermitteln. Sie müssen also die entsprechende Anzahl von Zeilen überspringen und öffnen oder sie zuerst separat mit einem Editor öffnen.


#Berechnung) ###Korrelation

In [211]: df = pd.DataFrame(np.random.random(size=(100, 5)))

In [212]: corr_mat = df.corr()

In [213]: mask = np.tril(np.ones_like(corr_mat, dtype=np.bool), k=-1)

In [214]: corr_mat.where(mask)
Out[214]: 
          0         1         2         3   4
0       NaN       NaN       NaN       NaN NaN
1 -0.018923       NaN       NaN       NaN NaN
2 -0.076296 -0.012464       NaN       NaN NaN
3 -0.169941 -0.289416  0.076462       NaN NaN
4  0.064326  0.018759 -0.084140 -0.079859 NaN

[Code lesen]

mask
array([[False, False, False, False, False],
       [ True, False, False, False, False],
       [ True,  True, False, False, False],
       [ True,  True,  True, False, False],
       [ True,  True,  True,  True, False]])
>
mask2 = np.triu(np.ones_like(corr_mat, dtype=np.bool), k=-1)
mask2
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [False,  True,  True,  True,  True],
       [False, False,  True,  True,  True],
       [False, False, False,  True,  True]])
>
corr_mat.where(mask2)
>
0	1	2	3	4
0	1.000000	-0.022615	0.047486	0.092043	-0.112379
1	-0.022615	1.000000	-0.336864	-0.025473	0.004696
2	NaN			-0.336864	1.000000	0.047746	-0.008458
3	NaN			NaN			0.047746	1.000000	0.133289
4	NaN			NaN			NaN			0.133289	1.000000

numpy.tril() ->Extrahieren Sie die untere Dreiecksmatrix aus dem Numpy-Array(Lower triangle of an array.) numpy.triu() ->Extrahieren Sie die obere Dreiecksmatrix aus dem Numpy-Array(Upper triangle of an array.)


Timedeltas(verstrichene Zeit)

In [218]: import datetime

In [219]: s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D'))

In [220]: s - s.max()
Out[220]: 
0   -2 days
1   -1 days
2    0 days
dtype: timedelta64[ns]

In [221]: s.max() - s
Out[221]: 
0   2 days
1   1 days
2   0 days
dtype: timedelta64[ns]

In [222]: s - datetime.datetime(2011, 1, 1, 3, 5)
Out[222]: 
0   364 days 20:55:00
1   365 days 20:55:00
2   366 days 20:55:00
dtype: timedelta64[ns]

In [223]: s + datetime.timedelta(minutes=5)
Out[223]: 
0   2012-01-01 00:05:00
1   2012-01-02 00:05:00
2   2012-01-03 00:05:00
dtype: datetime64[ns]

In [224]: datetime.datetime(2011, 1, 1, 3, 5) - s
Out[224]: 
0   -365 days +03:05:00
1   -366 days +03:05:00
2   -367 days +03:05:00
dtype: timedelta64[ns]

In [225]: datetime.timedelta(minutes=5) + s
Out[225]: 
0   2012-01-01 00:05:00
1   2012-01-02 00:05:00
2   2012-01-03 00:05:00
dtype: datetime64[ns]

[Code lesen]

# 2 Wochen später
s + datetime.timedelta(weeks=2)
>
0   2012-01-15
1   2012-01-16
2   2012-01-17
dtype: datetime64[ns]
# vor 2 Wochen
s + datetime.timedelta(weeks=-2)
>
0   2011-12-18
1   2011-12-19
2   2011-12-20
dtype: datetime64[ns]

###Addition und Subtraktion von verstrichener Zeit und Datum

In [226]: deltas = pd.Series([datetime.timedelta(days=i) for i in range(3)])

In [227]: df = pd.DataFrame({'A': s, 'B': deltas})

In [228]: df
Out[228]: 
           A      B
0 2012-01-01 0 days
1 2012-01-02 1 days
2 2012-01-03 2 days

In [229]: df['New Dates'] = df['A'] + df['B']

In [230]: df['Delta'] = df['A'] - df['New Dates']

In [231]: df
Out[231]: 
           A      B  New Dates   Delta
0 2012-01-01 0 days 2012-01-01  0 days
1 2012-01-02 1 days 2012-01-03 -1 days
2 2012-01-03 2 days 2012-01-05 -2 days

In [232]: df.dtypes
Out[232]: 
A             datetime64[ns]
B            timedelta64[ns]
New Dates     datetime64[ns]
Delta        timedelta64[ns]
dtype: object

[Code lesen]

# Führen Sie eine wöchentliche Zugabe durch
w_deltas = pd.Series([datetime.timedelta(weeks=i) for i in range(3)])
w_deltas
0    0 days
1    7 days
2   14 days
dtype: timedelta64[ns]
>
df['W_Delta'] = df['A'] + w_deltas
>
A	B	New Dates	Delta	W_Delta
0	2012-01-01	0 days	2012-01-01	0 days	2012-01-01
1	2012-01-02	1 days	2012-01-03	-1 days	2012-01-09
2	2012-01-03	2 days	2012-01-05	-2 days	2012-01-17

#Aliasnamen-Alias ###Um Achsennamen-Aliase global bereitzustellen, können Sie zwei Funktionen definieren:

def set_axis_alias(cls, axis, alias):
    if axis not in cls._AXIS_NUMBERS:
        raise Exception("invalid axis [%s] for alias [%s]" % (axis, alias))
     cls._AXIS_ALIASES[alias] = axis

def clear_axis_alias(cls, axis, alias):
     if axis not in cls._AXIS_NUMBERS:
        raise Exception("invalid axis [%s] for alias [%s]" % (axis, alias))
     cls._AXIS_ALIASES.pop(alias, None)

set_axis_alias(pd.DataFrame, 'columns', 'myaxis2')
df2 = pd.DataFrame(np.random.randn(3, 2), columns=['c1', 'c2'],
                   index=['i1', 'i2', 'i3'])

In [241]: df2.sum(axis='myaxis2')
Out[241]: 
i1   -0.461013
i2    2.040016
i3    0.904681
dtype: float64

In [242]: clear_axis_alias(pd.DataFrame, 'columns', 'myaxis2')

[Code lesen]

# In df2.sum ist ein Fehler aufgetreten (axis = 'myaxis2').
df2.sum(axis=1)

Ich denke, diese Funktion kann ihren eigenen Achsnamen definieren, aber in Wirklichkeit tritt ein Fehler auf und es wird kein Ergebnis erhalten.axis=1Wurde durch Angabe erhalten.

Creating example data(Beispieldaten erstellen)

In [243]: def expand_grid(data_dict):
              rows = itertools.product(*data_dict.values())
              return pd.DataFrame.from_records(rows, columns=data_dict.keys())

In [244]: df = expand_grid({'height': [60, 70],
                            'weight': [100, 140, 180],
                            'sex': ['Male', 'Female']})

In [245]: df
Out[245]: 
    height  weight     sex
0       60     100    Male
1       60     100  Female
2       60     140    Male
3       60     140  Female
4       60     180    Male
5       60     180  Female
6       70     100    Male
7       70     100  Female
8       70     140    Male
9       70     140  Female
10      70     180    Male
11      70     180  Female

#Beispieldaten erstellen *Um einen Datenrahmen aus allen Kombinationen eines bestimmten Werts zu erstellen, können Sie ein Wörterbuch erstellen, in dem der Schlüssel der Spaltenname und der Wert eine Liste von Datenwerten ist.

In [243]: def expand_grid(data_dict):
              rows = itertools.product(*data_dict.values())
              return pd.DataFrame.from_records(rows, columns=data_dict.keys())

In [244]: df = expand_grid({'height': [60, 70],
                            'weight': [100, 140, 180],
                            'sex': ['Male', 'Female']})

In [245]: df
Out[245]: 
    height  weight     sex
0       60     100    Male
1       60     100  Female
2       60     140    Male
3       60     140  Female
4       60     180    Male
5       60     180  Female
6       70     100    Male
7       70     100  Female
8       70     140    Male
9       70     140  Female
10      70     180    Male
11      70     180  Female

[Code lesen]

# * dict.values () erweitert Werte im Wörterbuchstil
d_dict = {'height': [60, 70], 'weight': [100, 140, 180], 'sex': ['Male', 'Female']}
print(*d_dict.values())
[60, 70] [100, 140, 180] ['Male', 'Female']
>
# Alle Kombinationen direktes Produkt (Produkt dekartieren) itertools.product ist ein Iterator
rows = itertools.product(*d_dict.values())
>
for r in rows:
    print(r)
>
(60, 100, 'Male')
(60, 100, 'Female')
(60, 140, 'Male')
(60, 140, 'Female')
(60, 180, 'Male')
(60, 180, 'Female')
(70, 100, 'Male')
(70, 100, 'Female')
(70, 140, 'Male')
(70, 140, 'Female')
(70, 180, 'Male')
(70, 180, 'Female')

#Nachwort *Danke, dass du bis zum Ende zugesehen hast. Es ist ungefähr zweieinhalb Jahre her, seit ich angefangen habe, die Python-Sprache zu lernen, und das Selbststudium des offiziellen Kochbuchs war ein Kampf. *Beim ersten Mal habe ich die gleichen Daten wie die offiziellen Daten vorbereitet, aber ich habe aufgegeben, weil ich unterwegs nicht an Beispieldaten denken konnte. *Beim zweiten Mal habe ich versucht, den Code-Leseteil mit der Faltfunktion durch Zitieren der Formel zu erstellen, aber ich habe festgestellt, dass dies nicht das Gefühl des Kampfes vermittelt. Bitte verzeihen Sie den Teil, der ohne das genaue Verständnis und die Beschreibung der Sprache nicht vollständig erklärt wird. Das wahre Gefühl nach dem Abschluss ist"Derjenige, der den Index kontrolliert, kontrolliert die Pandas."**Ich dachte. *Für die Erklärung beim Lesen von Code habe ich zum ersten Mal Mathjax verwendet, aber es ist nicht bekannt, ob es funktioniert hat.