2017-06-20 3 views
1

Lassen Sie uns sagen, ich habe folgende DatenFilter Pandas Datenrahmen von String-Länge innerhalb der Gruppe

import pandas as pd 
df = pd.DataFrame(data=[[1, 'a'], [1, 'aaa'], [1, 'aa'], 
         [2, 'bb'], [2, 'bbb'], 
         [3, 'cc']], 
        columns=['key', 'text']) 

    key text 
0 1 a 
1 1 aaa 
2 1 aa 
3 2 bb 
4 2 bbb 
5 3 cc 

Was ich möchte Gruppe tun, ist durch die key Variable und die Daten durch die Länge der text innerhalb jeder Gruppe sortieren und am Ende mit einem einzigen Series von Indexwerten, um den Datenrahmen neu zu indizieren. Ich dachte, ich nur so etwas tun könnte:

df.groupby('key').text.str.len().sort_values(ascending=False).index 

Aber es sagte, ich brauche apply zu verwenden, so dass ich versuchte, dies:

df.groupby('key').apply(lambda x: x.text.str.len().sort_values(ascending=False).index, axis=1) 

Aber das sagte mir, dass lambda ein unerwartetes Stichwort bekommt: axis .

Ich bin relativ neu zu Pandas, also bin ich nicht sicher, wie man das macht. Mein Ziel ist es auch, die Daten einfach zu deduplizieren, so dass ich für jeden key den Wert mit dem längsten Wert von text behalten kann. Die erwartete Ausgabe lautet:

key text 
1 1 aaa 
4 2 bbb 
5 3 cc 

Wenn es ein einfacherer Weg, dies zu tun, als was ich bin versucht, ich bin so gut, dass offen.

Antwort

3
df.groupby('key', as_index=False).apply(lambda x: x[x.text.str.len() == x.text.str.len().max()]) 

Ausgang:

 key text 
0 1 1 aaa 
1 4 2 bbb 
2 5 3 cc 
+0

es genagelt, Vielen Dank! – brittenb

+0

Gern geschehen und danke. –

0
def get_longest_string(row): 
    return [x for x in row.tolist() if len(x) == max([len(x) for x in row.tolist()])] 

res = df.groupby('key')['text'].apply(get_longest_string).reset_index() 

Ausgang:

key text 
0 1 [aaa] 
1 2 [bbb] 
2 3 [cc] 
2

Keine Notwendigkeit für den Zwischenschritt. Sie können eine Reihe mit den Saitenlängen wie diese:

df['text'].str.len() 

Jetzt juut groupby-Taste und geben den Wert indiziert, wenn die Länge der Zeichenfolge ist die größte mit idxmax()

In [33]: df.groupby('key').agg(lambda x: x.loc[x.str.len().idxmax()]) 
Out[33]: 
    text 
key 
1 aaa 
2 bbb 
3  cc 
Verwandte Themen