假设我有以下数据
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
如果有一种比我正在尝试的更简单的方法,我也会对此持开放态度。
答案 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]