分组并取平均字符长度

Grouping and taking average length of characters

我有一个数据集如下

Cty  A1  
AA  A123
AA  1111 
AA  99999
BB  a9999
BB  345689
BB  345699 
CC  1233 

我需要按国家/地区对数据进行分组,并针对每个国家/地区确定列 A1 和 A2 的字符的平均长度。

因此对于国家 AA,我们看到 A1 列中的 3 行有 13 个字符,在计算平均值时我们将得到 4.333(即 13 / 3),对于 B 也是如此,我们将得到平均值5.66

我用下面的代码实现了同样的效果

df = (df.groupby('Cty')['A1'].apply(lambda x: np.mean(x.str.len())).reset_index(name='mean_len_text'))

但是出现以下错误

~\anaconda3\lib\site-packages\pandas\core\strings\accessor.py in __init__(self, data)
    152         from pandas.core.arrays.string_ import StringDtype
    153 
--> 154         self._inferred_dtype = self._validate(data)
    155         self._is_categorical = is_categorical_dtype(data.dtype)
    156         self._is_string = isinstance(data.dtype, StringDtype)

~\anaconda3\lib\site-packages\pandas\core\strings\accessor.py in _validate(data)
    215 
    216         if inferred_dtype not in allowed_types:
--> 217             raise AttributeError("Can only use .str accessor with string values!")
    218         return inferred_dtype
    219 

AttributeError: Can only use .str accessor with string values!

我尝试将列转换为字符串,运行 如下所示,但出现属性错误

df = (df.groupby('Cty')['A1'].astype(str).str.apply(lambda x: np.mean(x.str.len())).reset_index(name='mean_len_text'))

Error msg
AttributeError: 'SeriesGroupBy' object has no attribute 'astype'

想法是将每个国家/地区的平均字符长度放在单独的列中。

不确定如何进行相同的操作

非常感谢您的帮助。

您可以将 Series 传递给 groupby,因此应通过 Series.astype with Series.str.len 简化解决方案,然后根据 df['Cty'] 汇总 mean:

df1 = (df['A1'].astype(str)
               .str.len()
               .groupby(df['Cty'])
               .mean()
               .reset_index(name='mean_len_text'))

另一种解决方案是先在 DataFrame.assign 中创建列 mean_len_text,然后聚合 mean:

df1 = (df.assign(mean_len_text = df['A1'].astype(str)
                                         .str.len())
         .groupby('Cty', as_index=False)['mean_len_text']
         .mean())

你的 lambda 函数解决方案 astype:

df1 = (df.groupby('Cty')['A1']
         .apply(lambda x: x.astype(str).str.len().mean())
         .reset_index(name='mean_len_text'))

您可以使用 GroupBy.mean 传递 df['Cty'] 作为石斑鱼:

df['A1'].astype(str).str.len().groupby(df['Cty']).mean()

注意。如果您已经有字符串,则可以跳过到字符串的转换。

输出:

Cty
AA    4.333333
BB    5.666667
CC    4.000000
Name: A1, dtype: float64

注意。如果你想要一个 DataFrame,请添加你的 .reset_index(name='mean_len_text')

您的方法的修正可以是:

df.groupby('Cty')['A1'].apply(lambda x: x.str.len().mean())

但这应该会明显降低效率。