gpt4 book ai didi

python - pandas - 对列进行分组并获取另一个带有空值的字符串列的最大长度

转载 作者:行者123 更新时间:2023-12-03 08:16:13 25 4
gpt4 key购买 nike

我有一个像这样的 pandas DataFrame:

  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中的第一个和第二大句子)。

最佳答案

第一个想法是使用 lambda 函数 Series.str.len最大:

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

或者您可以先使用Series.str.len然后聚合max:

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

此外,如果需要整数,请先使用 DataFrame.dropna :

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

编辑:对于第一个和第二个最高值,请使用 DataFrame.sort_valuesGroupBy.head :

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

替代解决方案 SeriesGroupBy.nlargest ,明显更慢:

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

关于python - pandas - 对列进行分组并获取另一个带有空值的字符串列的最大长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69298668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com