分组并取平均字符长度
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())
但这应该会明显降低效率。
我有一个数据集如下
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())
但这应该会明显降低效率。