2017-06-07 11 views
2

Ich möchte den häufigsten Buchstaben für jede Nummer. Ich habe verschiedene Dinge ausprobiert; nicht sicher, was der richtige Weg ist.Erhalten am häufigsten Spalte für jede Spalte Wert

import pandas as pd 
from pandas import DataFrame, Series 

original = DataFrame({ 
    'letter': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}, 
    'number': {0: '01', 1: '01', 2: '02', 3: '02', 4: '02'} 
}) 

expected = DataFrame({'most_common_letter': {'01': 'A', '02': 'B'}}) 

Idealerweise versuche ich, die Lesbarkeit zu maximieren.

Antwort

2

Wir DataFrame.mode() Methode verwenden können:

In [43]: df.groupby('number')[['letter']] \ 
      .apply(lambda x: x.mode()) \ 
      .reset_index(level=1, drop=True) 
Out[43]: 
     letter 
number 
01   A 
02   B 
2

Verwenden Sie groupby + apply + value_counts + wählen Sie zuerst index Werte, weil die Werte sortiert sind.

Last konvertieren Seriesto_frame und Indexnamen entfernen, indem rename_axis:

df = original.groupby('number')['letter'] \ 
      .apply(lambda x: x.value_counts().index[0]) 
      .to_frame('most_common_letter') 
      .rename_axis(None) 
print (df) 
    most_common_letter 
01     A 
02     B 

ähnliche Lösung:

from collections import Counter 

df = original.groupby('number')['letter'] \ 
      .apply(lambda x: Counter(x).most_common(1)[0][0]) \ 
      .to_frame('most_common_letter') \ 
      .rename_axis(None) 
print (df) 
    most_common_letter 
01     A 
02     B 

Oder Series.mode verwenden:

df = original.groupby('number')['letter'] \ 
      .apply(lambda x: x.mode()[0][0]) 
      .to_frame('most_common_letter') 
      .rename_axis(None) 
print (df) 
    most_common_letter 
01     A 
02     B 
+0

Gibt es eine Möglichkeit die Lesbarkeit zu erhöhen, indem sie mit '.idxmax()', oder was? – Hatshepsut

+0

Leider habe ich jetzt keine Ahnung :( – jezrael

1
>>> df = pd.DataFrame({ 
    'letter': {0: 'A', 1: 'A', 2: 'A', 3: 'B', 4: 'B'}, 
    'number': {0: '01', 1: '01', 2: '02', 3: '02', 4: '02'}}) 
>>> df['most_common_letter']=df.groupby('number')['letter'].transform(max) 
>>> df = df.iloc[:,1:].drop_duplicates().set_index('number') 
>>> df.index.name = None 
>>> df 
    most_common_letter 
01     A 
02     B 

Oder diese Weise, wenn es die Lesbarkeit hilft:

>>> df['most_common_letter']=df.groupby('number')['letter'].transform(max) 
>>> df = df.drop('letter', axis=1).drop_duplicates().rename({'number': None}).set_index('number') 
>>> df 
    most_common_letter 
01     A 
02     B 
Verwandte Themen