Ich muss oft Pandas Dataframe df
von df[df['col_name']=='string_value']
zu filtern, und ich möchte die Zeilenauswahl Operation beschleunigen, gibt es einen schnellen Weg, das zu tun?Wie Pandas Zeilenfilterung durch String-Matching zu beschleunigen?
Zum Beispiel
In [1]: df = mul_df(3000,2000,3).reset_index()
In [2]: timeit df[df['STK_ID']=='A0003']
1 loops, best of 3: 1.52 s per loop
1.52s verkürzen werden kann?
Hinweis:
mul_df()
ist Funktion Multi-Level-Datenrahmen zu erstellen:
>>> mul_df(4,2,3)
COL000 COL001 COL002
STK_ID RPT_Date
A0000 B000 0.6399 0.0062 1.0022
B001 -0.2881 -2.0604 1.2481
A0001 B000 0.7070 -0.9539 -0.5268
B001 0.8860 -0.5367 -2.4492
A0002 B000 -2.4738 0.9529 -0.9789
B001 0.1392 -1.0931 -0.2077
A0003 B000 -1.1377 0.5455 -0.2290
B001 1.0083 0.2746 -0.3934
Unten ist der Code von mul_df():
import itertools
import numpy as np
import pandas as pd
def mul_df(level1_rownum, level2_rownum, col_num, data_ty='float32'):
''' create multilevel dataframe, for example: mul_df(4,2,6)'''
index_name = ['STK_ID','RPT_Date']
col_name = ['COL'+str(x).zfill(3) for x in range(col_num)]
first_level_dt = [['A'+str(x).zfill(4)]*level2_rownum for x in range(level1_rownum)]
first_level_dt = list(itertools.chain(*first_level_dt)) #flatten the list
second_level_dt = ['B'+str(x).zfill(3) for x in range(level2_rownum)]*level1_rownum
dt = pd.DataFrame(np.random.randn(level1_rownum*level2_rownum, col_num), columns=col_name, dtype = data_ty)
dt[index_name[0]] = first_level_dt
dt[index_name[1]] = second_level_dt
rst = dt.set_index(index_name, drop=True, inplace=False)
return rst
Warum nicht als Index beibehalten (oder wenn es sich nicht um einen Index handelt, als Index festlegen)? Die Auswahl auf dem Index ist viel schneller ('df.ix ['A0003']'): für mich 194 us vs 646 ms. – joris
Das ist nur ein Beispiel. Oft müssen wir nach Spalte anstatt nach Index wählen; es als einen Index zu setzen ist eine Option, aber es führt zu einem anderen Problem (Index existiert bereits, ändern Datenstruktur usw.) (Wenn wir Datenframe als Datenbanktabelle behandeln, ist es sehr üblich: SELECT * FROM Tabellenname WHERE Col_Name = 'String_Wert ', nicht wahr?) – bigbug