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
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.
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.
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])]
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()
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])
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())
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()
a = [1,2,3,4,5]
pd.DataFrame({'hello': a})
>>>
hello
0 1
1 2
2 3
3 4
4 5
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"}]'
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.
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))
pd.DataFrame.assig()
df['a'], df['b'] = value_a, valueb
Verwenden Sie stattdessen zuweisen
df.assign(a=value_a, b=value_b)
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]
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])
>>> 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])
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)
def df_sort(df):
return df.reindex(sorted(df.columns), axis=1)
df.columns.str.contains('required string')
df.apply(lambda x: x.isnull().sum(), axis=0)
Verwenden Sie pd.get_dummies ()
Recommended Posts