[PYTHON] [Memo] Kleine Geschichte von Pandas, numpy

Ein Memo einer kleinen Geschichte, die häufig verwendet wird, aber nicht verwendet wird, und es gibt viele andere Möglichkeiten, sie sofort zu vergessen

1. Zählen Sie die Anzahl der Proben pro Tag

Angenommen, Sie haben einen Datenrahmen vom Typ Zeitstempel.

timestamp  score
2013-06-29 00:52:28+00:00        -0.420070
2013-06-29 00:51:53+00:00        -0.445720
2013-06-28 16:40:43+00:00         0.508161
2013-06-28 15:10:30+00:00         0.921474
2013-06-28 15:10:17+00:00         0.876710

Ich möchte die Anzahl der Proben pro Tag so überprüfen.

            score
2013-06-28      3
2013-06-29      2

Ich möchte ein leeres Array vorbereiten, jeden Tag gruppieren, die Anzahl der Samples mit count überprüfen, es mit einer for-Anweisung anhängen und die mühsame Arbeit in einer Zeile erledigen.

df.groupby(df.index.date).count()

Sie können es einfach verarbeiten, indem Sie den Index des Datenrahmens an pd.DataFrame.groupby () übergeben.

example1.py


import io
import pandas as pd
content = '''\
timestamp  score
2013-06-29 00:52:28+00:00        -0.420070
2013-06-29 00:51:53+00:00        -0.445720
2013-06-28 16:40:43+00:00         0.508161
2013-06-28 15:10:30+00:00         0.921474
2013-06-28 15:10:17+00:00         0.876710
'''

df = pd.read_table(io.BytesIO(content), sep='\s{2,}', parse_dates=[0], index_col=[0])

print(df)

print(df.groupby(df.index.date).count())

Wenn es um schwere Verarbeitung geht, neigen wir dazu, groupby () zu vermeiden, aber es kann mit datetime kompatibel sein.

2. Ich möchte die Spalten von pd.DataFrame nach mehreren Teilen durchsuchen, die mit der Zielzeichenfolge übereinstimmen.

Wenn es einen Datenrahmen mit einer solchen Spalte gibt,

print df.columns

Index([u'A_0', u'A_1', u'A_2', u'B_0', u'B_1', u'B_2', u'C_0', u'C_1', u'C_2', u'C_3'], dtype='object', length=121)

Zum Beispiel möchte ich nur die Spalte von 'B_' daraus filtern. Es gibt verschiedene String-Übereinstimmungen, aber Sie können find verwenden

df.ix[:, np.where(df.columns.str.find('B')==0)[0]]

str.find () gibt die Liste per T / F zurück. Nehmen Sie sie also mit ix so heraus, wie sie ist.

3. Extrahieren Sie Spalten / Zeilen mit mehreren spezifischen Werten aus dem Datenrahmen, indem Sie list als Filterbedingung verwenden.

df[df.A > 0]

Ich möchte einen solchen allgemeinen bedingten Ausdruck mit einer Liste als Bedingung verwenden. Sie können es sofort mit isin tun.

df[df['A'].isin([0, 1, 2, 3])]

Ähnliche Operationen können mit numpy ausgeführt werden.

a = np.array([0,1,2,3])
a[np.isin(a,[1,2,5,7])]

4. Downsample-Daten mit geringem Probenabstand

Verwenden Sie pandas.DatatimeIndex und führen Sie ein Resample durch Angenommen, Sie haben die folgenden Daten mit Zeitstempeln, bei denen das Abtastintervall nicht konstant ist.

['2016-11-11 01:41:29', '2016-11-11 01:41:31',
'2016-11-11 01:41:32', '2016-11-11 01:41:33',
'2016-11-11 01:41:34', '2016-11-11 01:41:35',
'2016-11-11 01:41:36', '2016-11-11 01:41:37',
'2016-11-11 01:41:38', '2016-11-11 01:41:38',...

Das Downsampling mit groupby dauert zu lange, daher ist das Downsampling leichter.

x['date'] = pd.to_datetime(x.date)
X = x.copy().set_index('date')

Ändern Sie das Datum mit to_timestamp in pd.DatetimeIndex. Datum auf Index setzen.

X.resample('5S').dropna()

DatetimeIndex kann durch erneutes Abtasten mit einer solchen Frequenz leicht heruntergesampelt werden.

5. Konvertieren Sie die Dreiecksmatrix in ein Array

Angenommen, Sie haben eine solche obere Dreiecksmatrix zur Hand.

A = array([[ 4,  0,  3],
           [ 0,  4, -2],
           [ 0,  0,  7]])

Ich möchte eine Liste solcher Werte erhalten.

[4, 0, 3, 4, -2, 7]

Gelöst mit numpy.triu_indies ().

>>> A[np.triu_indices(3)]
array([ 4,  0,  3,  4, -2,  7])

Beim Entfernen von Diagonalenwerten, die in Wärmekarten usw. üblich sind, ist eine Anpassung durch Angabe von k möglich.

>>> A[np.triu_indices(3, k=1)]
array([ 0,  3, -2])

6. Vereinfachen Sie die Elementzählung

Um die Daten zu zählen (erstellen Sie ein Histogramm)

labels = pd.Series(['A', 'B', 'C', 'A', 'C', 'A'])
0    A
1    B
2    C
3    A
4    C
5    A

Verwenden Sie dazu defaultdict.

from collections import Counter, defaultdict
counts = defaultdict(int)
for l in labels:
    for l2 in l:
        counts[l2] += 1

Die Ausgabe sieht so aus. defaultdict(<class 'int'>, {'A': 3, 'B': 1, 'C': 2})

Mit Pandas können Sie dies einfacher mit Gruppieren nach tun. Wenn Sie jedoch verschachtelte Tags wie das folgende zählen möchten, können Sie sie einfach extrahieren, indem Sie einfach eine for-Anweisung hinzufügen.

labels = pd.Series([['A', 'B'], ['C', 'A'],[ 'C', 'A', 'D'], ['D', 'A', 'B']])

from collections import Counter, defaultdict
counts = defaultdict(int)
for l in labels:
    for l2 in l:
        counts[l2] += 1

Natürlich können der Schlüssel und der Wert des Rückgabewerts wie folgt aufgelistet werden.

list(counts.keys())
list(counts.values())

7. Verschachtelte Liste Einschlussnotation

Um das Nest mit for zu drehen, schreiben Sie wie folgt.

[x for inner_list in [[1, 3], [5], [7, 9]] for x in inner_list]
>>> [1, 3, 5, 7, 9]

Übrigens können Sie damit auch das in "6. Zählelemente vereinfachen" beschriebene verschachtelte Histogramm erstellen.

pd.DataFrame({'numbers':numbers}).groupby('numbers').size().plot.bar()
スクリーンショット 2017-07-18 17.33.04.png

8. Geben Sie in Pandas DataFrame Daten ein, während Sie Spaltennamen angeben

a = [1,2,3,4,5]
pd.DataFrame({'hello': a})
>>>
 	hello
0	1
1	2
2	3
3	4
4	5

9. Erstellen Sie einen Json aus mehreren Listen

Erstellen Sie json aus der Liste.

a=["USA","France","Italy"]
b=["10","5","6"]

Aus dieser Liste möchte ich den folgenden JSON erstellen.

[{'country': 'USA', 'wins': '10'},
 {'country': 'France', 'wins': '5'},
 {'country': 'Italy', 'wins': '6'}]

Es gibt zwei Methoden. Das erste ist das Listenverständnis

>>> [{'country': country, 'wins': wins} for country, wins in zip(a, b)]
[{'country': 'USA', 'wins': '10'},
 {'country': 'France', 'wins': '5'},
 {'country': 'Italy', 'wins': '6'}]

Der zweite ist JSON Dump

>>> json.dumps(
...     [{'country': country, 'wins': wins} for country, wins in zip(a, b)]
... )
'[{"country": "USA", "wins": "10"}, {"country": "France", "wins": "5"}, {"country": "Italy", "wins": "6"}]'

10. Laden Sie jsonl mit DataFrame

Ich möchte jsonl mit einer unterschiedlichen Anzahl von Elementen in einer Zeile lesen, ohne den Wörterbuchtyp durchzugehen.

json_string = '{"first_name": "Guido", "last_name":"Rossum"}, {"first_name": "Guido", "last_name":"Terry", "test_name": "test-man"}'
parsed_json = pd.read_json(json_string, lines=True)
print(parsed_json)
first_name last_name test_name
0 Guido Rossum NaN
1 Guido Terry test-man

Wenn Sie pd.read_json (lines = True) verwenden, können Sie die json-Zeile sauber lesen.

11. Erstellen Sie einen geschichteten JSON aus der Liste

Ich möchte den folgenden Json erstellen.

{'filename': 'filename',
 'data': [{'keyword': 'bomber',
   'term_freq': 5,
   'lists': [{'occurrance': 1},
    {'occurrance': 2},
    {'occurrance': 3},
    {'occurrance': 4},
    {'occurrance': 5}]},
  {'keyword': 'irritation',
   'term_freq': 5,
   'lists': [{'occurrance': 1},
    {'occurrance': 3},
    {'occurrance': 5},
    {'occurrance': 7},
    {'occurrance': 8}]}]}

Verwenden Sie dict.

import json

dic = {
        "bomber": [1, 2, 3, 4, 5],
        "irritation": [1, 3, 5, 7, 8]
      }


json_dict = {}
data = []

#Datenerstellung
for k, v in dic.items():
    tmp_dict = {}
    
    #Schlüsselwort hinzufügen
    tmp_dict["keyword"] = k
    
    #Listenlänge hinzufügen
    tmp_dict["term_freq"] = len(v)
    
    #Fügen Sie dem Inhalt der Liste ein Schlüsselwort hinzu
    tmp_dict["lists"] = [{"occurrance": i} for i in v]
    
    data.append(tmp_dict)

json_dict["filename"] = 'filename'
json_dict["data"] = data

print(json.dumps(json_dict))

12. Speichern Sie mehrere Anfangswerte als neue Spalten

pd.DataFrame.assig()

df['a'], df['b'] = value_a, valueb

Verwenden Sie stattdessen zuweisen

df.assign(a=value_a, b=value_b)

13. Ich möchte schnell Werte von einem DataFrame abrufen

Wenn es sich um pd.DataFrame.loc [0,0] oder pd.DataFrame.values handelt, wird der Array-Typ ausgegeben.

Verwenden Sie pd.DataFrame.iat [0,0]

14. Sparen Sie in regelmäßigen Abständen schwere Verarbeitung

Teilen Sie die DF-Zeile in reguläre Abschnitte und führen Sie to_csv () aus Das Verfahren der gleichen Teilung ist wie folgt

x = 17
n = 3
l = [(x + i) // n for i in range(n)]
l
>>> [5, 6, 6]

Schreiben Sie Folgendes in _csv um

#Erstellen Sie einen geeigneten DF zum Testen
df = pd.DataFrame(data={
    'a': range(10),
    'b': list(map(lambda x: x/5, list(range(10))))
})

test = []
for num in range(n):
    begin = sum(l[:num])
    end = sum(l[:(num+1)])
    test.append(df.iloc[begin:end])

15. Ich möchte mehrere Elemente von einer Liste ausschließen

>>> a = range(1, 10)
>>> [x for x in a if x not in [2, 3, 7]]
[1, 4, 5, 6, 8, 9]

Es scheint, dass dies auch getan werden kann

x = set(range(10))
y = x - set([2, 3, 7])
# y = set([0, 1, 4, 5, 6, 8, 9])
  1. Set list into DataFrame as value Die Liste wird möglicherweise nicht im DF gespeichert.
df = pd.DataFrame(data={
    'a': [1, 2],
    'b': [2, 3]
})
df['c'] = [[3]]

Da oben ein Fehler auftritt, führen Sie ihn wie folgt aus.

df = pd.DataFrame(data={
    'a': [1, 2],
    'b': [2, 3]
})
df['c'] = [[3]] * len(df)

17. Ordnen Sie die Spaltenreihenfolge an

def df_sort(df):
    return df.reindex(sorted(df.columns), axis=1)

18. Suchen Sie nach Zeichenketten aus Spaltennamen

df.columns.str.contains('required string')

19. pd.DataFrame.to_json () orientiert sich an der Kurzreferenztabelle

Screen Shot 2018-11-01 at 14.32.14.png

20. Zählen Sie fehlende Werte in allen Spalten gleichzeitig

df.apply(lambda x: x.isnull().sum(), axis=0)

21. Ich möchte OneHotEncorder verwenden

Verwenden Sie pd.get_dummies ()

Recommended Posts

[Memo] Kleine Geschichte von Pandas, numpy
Kleine Geschichte: Numpy Flatten Mechanismus
Pandas Memo
[Python] Operationsnotiz von Pandas DataFrame
Pandas Memo
[Python] Numpy Memo
[Kleine Geschichte] Laden Sie das Bild von Ghibli sofort herunter
Über alles von numpy
Numpy Grundberechnungsnotiz
Pandas Reverse Memo
Grundlegende Bedienung von Pandas
Python kleine Geschichte Sammlung
Grundlegende Bedienung von Pandas
Die Geschichte von sys.path.append ()
[Numpy / Pandas / Matplotlib Übung 01]
Funktion von NumPy einstellen
[Memo] Lade csv von s3 mit boto3 in Pandas
Python Basic - Pandas, Numpy -
Summe mehrerer Numpy-Arrays (Summe)
Die Geschichte des Baus von Zabbix 4.4
Geschichte auf Programmebene von libscips ① (α0.0.1)
Qiita Memo meiner Gedanken
Merkmale der Programmiersprache [Memo]
Ein kleines Memorandum von openpyxl
[Memo] Bau einer Cygwin-Umgebung
Über alle von numpy (2.)
Mein umgekehrtes Numpy / Scipy-Memo
App Service Kleine Story-Sammlung
Visualisierungsnotiz von Pandas, Seaborn
Zusammenfassung der grundlegenden Verwendung von Pandas
Verhalten der Pandas Rolling () Methode
Index der Verwendung bestimmter Pandas
Die Kraft der Pandas: Python