2017-06-20 376 views
1

內比方說,我有以下數據過濾大熊貓據幀

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 

我想什麼做的是組由key變量並通過text長度每個組內的數據進行排序和最終得到索引值的單個Series用於重新索引數據幀。我想我可能只是做這樣的事情:

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

但它說我需要使用apply,所以我嘗試這樣做:

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

但是,告訴我,lambda得到了一個意想不到的關鍵字:axis

我對熊貓比較新,所以我不知道如何去做這件事。另外,我的目標是簡單地對數據進行重複數據刪除,以便每個key的數值保持最長值text。預期的輸出是:

key text 
1 1 aaa 
4 2 bbb 
5 3 cc 

如果有做到這一點比我嘗試一個更簡單的方法,我接受這一點。

回答

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

輸出:

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

釘它,謝謝! – brittenb

+0

不客氣,謝謝。 –

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() 

輸出:

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

無需中間步驟。你可以得到一系列的字符串長度是這樣的:

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

現在juut GROUPBY鍵,返回索引,其中字符串的長度是最大的使用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