Mam ramkę danych z kolumnami numerycznymi. Dla każdej kolumny chciałbym obliczyć informacje kwantyle i przypisać każdy wiersz do jednego z nich. Próbowałem użyć qcut()
method, aby zwrócić listę pojemników, ale zamiast tego wyliczyłem indywidualnie te pojemniki. To, co myślałem, że może istnieć, ale nie mogłem go znaleźć, byłoby metodą taką jak df.to_quintile(num of quantiles)
. Oto, co wymyśliłem, ale zastanawiam się, czy jest to lepszy sposób na pandę/pandę.Konwertuj dane do kwilenu bin
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')
Dzięki, Zach cp
EDIT: Po obejrzeniu DSMS odpowiedzieć funkcja może być napisany znacznie prostsze (poniżej). Człowieku, to jest słodkie.
def quantile(column, quantile=5):
q = qcut(column, quantile)
return len(q.levels)- q.labels
df.apply(quantile)
#or
df['A'].apply(quantile)
dzięki DSM. Nie zdawałem sobie sprawy, że na wyjściu qcut() są etykiety. Właśnie tego potrzebowałem! – zach
Dzięki @DSM, nie wiedziałem, że qcut/cut ma atrybut label (nie jest wyświetlany niestety w autouzupełnianiu IPython). Do tej pory myślałem, że muszę wywoływać 'labels = False' do wywołania funkcji, aby uzyskać etykiety. Ale jest ładniej. – tim