按列排序,并获取另一个字符串列的最大长度(为null)

2024-09-30 20:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个熊猫数据框:

  source  text_column
0   a      abcdefghi
1   a      abcde
2   b      qwertyiop
3   c      plmnkoijb
4   a      NaN
5   c      abcde
6   b      qwertyiop
7   b      qazxswedcdcvfr

我想得到分组source列后text_column的长度,如下所示:

  source  something
    a        9
    b       14
    c        9

以下是我到目前为止尝试过的方法,所有这些方法都会产生错误:

>>> # first creating the group by object
>>> text_group = mydf.groupby(by=['source'])
>>> # now try to get the max length of "text_column" by each "source"
>>> text_group['text_column'].map(len).max()
>>> text_group['text_column'].len().max()
>>> text_group['text_column'].str.len().max()

如何在另一列按分组的情况下获得text_column的最大长度

为了避免产生新的问题,我如何获得第二大长度和相应的值(第text_column中的第一和第二大句子)


Tags: the数据方法textsourcebylengroup
3条回答

只需使用assignstr.len首先获取长度:

df.assign(text_column=df['text_column'].str.len()).groupby('source', as_index=False).max()

  source  text_column
0      a          9.0
1      b         14.0
2      c          9.0
>>> 

第一个想法是将lambda函数与^{}max一起使用:

df = (df.groupby('source')['text_column']
       .agg(lambda x: x.str.len().max())
       .reset_index(name='something'))
print (df)
  source  something
0      a        9.0
1      b       14.0
2      c        9.0

或者您可以先使用^{},然后聚合max

df = (df['text_column'].str.len()
                       .groupby(df['source'])
                       .max()
                       .reset_index(name='something'))
print (df)

如果需要整数,请首先使用^{}

df = (df.dropna(subset=['text_column'])
        .assign(text_column=lambda x: x['text_column'].str.len())
        .groupby('source', as_index=False)['text_column']
        .max())
print (df)

  source  text_column
0      a            9
1      b           14
2      c            9

编辑:对于第一个和第二个顶级值,使用^{}^{}

df1 = (df.dropna(subset=['text_column'])
        .assign(something=lambda x: x['text_column'].str.len())
        .sort_values(['source','something'], ascending=[True, False])
        .groupby('source', as_index=False)
        .head(2))
print (df1)
  source     text_column  something
0      a       abcdefghi          9
1      a           abcde          5
7      b  qazxswedcdcvfr         14
2      b       qwertyiop          9
3      c       plmnkoijb          9
5      c           abcde          5

具有^{}的替代解决方案,明显较慢:

df1 = (df.dropna(subset=['text_column'])
         .assign(something=lambda x: x['text_column'].str.len())
         .groupby('source')['something']
         .nlargest(2)
         .reset_index(level=1, drop=True)
         .reset_index())
print (df1)

  source  something
0      a          9
1      a          5
2      b         14
3      b          9
4      c          9
5      c          5

top1、top2新列的最后解决方案:

df=df.dropna(subset=['text_column']).assign(something=lambda x: x['text_column'].str.len())

df = df.sort_values(['source','something'], ascending=[True, False])
df['g'] = df.groupby('source').cumcount().add(1)

df = (df[df['g'].le(2)].pivot('source','g','something')
      .add_prefix('top') 
      .rename_axis(index=None, columns=None))
print (df)
   top1  top2
a     9     5
b    14     9
c     9     5

对我来说,最简单的解决方案是这样的(经过测试)-您实际上不需要groupby:

df['str_len'] = df.text_column.str.len()
df.sort_values(['str_len'], ascending=False)\
    .drop_duplicates(['source'])\
    .drop(columns='text_column')

  source  str_len
7      b     14.0
0      a      9.0
3      c      9.0
    

关于你的第二个问题,我认为groupby很适合你:

top_x = 2
df.groupby('source', as_index=False)\
    .apply(lambda sourcedf: sourcedf.sort_values('str_len').nlargest(top_x, columns='str_len', keep='all'))\
    .drop(columns='text_column')

相关问题 更多 >