Ho un dataframe con colonne numeriche. Per ogni colonna vorrei calcolare le informazioni quantili e assegnare ciascuna riga a una di esse. Ho provato a utilizzare lo qcut()
method per restituire un elenco di contenitori, ma ho finito per calcolare singolarmente i raccoglitori. Quello che pensavo potesse esistere ma non riuscivo a trovare sarebbe un metodo come df.to_quintile(num of quantiles)
. Questo è quello che mi è venuto in mente, ma mi chiedo se ci sia un modo più succinto/panda per farlo.Converti dati nel cestino quantile
import pandas as pd
#create a dataframe
df = pd.DataFrame(randn(10, 4), columns=['A', 'B', 'C', 'D'])
def quintile(df, column):
"""
calculate quintiles and assign each sample/column to a quintile
"""
#calculate the quintiles using pandas .quantile() here
quintiles = [df[column].quantile(value) for value in [0.0,0.2,0.4,0.6,0.8]]
quintiles.reverse() #reversing makes the next loop simpler
#function to check membership in quintile to be used with pandas apply
def check_quintile(x, quintiles=quintiles):
for num,level in enumerate(quintiles):
#print number, level, level[1]
if x >= level:
print x, num
return num+1
df[column] = df[column].apply(check_quintile)
quintile(df,'A')
grazie, Zach CP
EDIT: Dopo aver visto DSM rispondono alla funzione può essere scritta molto più semplice (in basso). Uomo, questo è dolce.
def quantile(column, quantile=5):
q = qcut(column, quantile)
return len(q.levels)- q.labels
df.apply(quantile)
#or
df['A'].apply(quantile)
grazie DSM. Non mi ero reso conto che l'output qcut() aveva etichette. Questo è proprio quello di cui avevo bisogno! – zach
Grazie a @DSM, non sapevo che qcut/cut avesse un attributo labels (non viene mostrato sfortunatamente nel completamento automatico di IPython). Finora ho pensato di chiamare 'labels = False' alla funzione-call per ottenere anche le etichette. Ma è più bello come questo. – tim