按组

时间:2017-06-20 18:01:19

标签: python pandas

假设我有以下数据

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

无需中间步骤。你可以得到一个像这样的字符串长度的系列:

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

现在juut groupby key,并使用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

答案 2 :(得分: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]