首页 > 解决方案 > 数据框行中内容的修剪/截断平均值

问题描述

我有一个数据框和一个字典。数据框的一列包含句子。我想从句子中取出每个单词,检查它是否在字典中并将其值分配给它。计算值(每个句子或行)的修剪/截断平均值(我在两端修剪 10%)并保存在额外的列中。

import pandas as pd
    test_df = pd.DataFrame({
    '_id': ['1a','2b','3c','4d'],
    'column': ['und der in zu',
                'Kompliziertereswort something',
                'Lehrerin in zu [Buch]',
                'Buch (Lehrerin) kompliziertereswort']})
test_dict=
{'und': 20,
     'der': 10,
     'in':  40,
     'zu':  10,
     'Kompliziertereswort': 2,
     'Buch': 5,
     'Lehrerin': 5}

计算算术平均值非常简单:

test_df['extra_col'] = (test_df['column'].str.split(expand=True)
                                     .stack().astype(str)
                                     .str.strip(string.punctuation)
                                     .map(test_dict)
                                     .astype(float)
                                     .groupby(level=0)
                                     .mean())

但是对于截断的平均值,我需要类似的东西:

from scipy import stats
m = stats.trim_mean(X, 0.1) 

其中 X 是一个数组。是否可以使用(部分)我当前的代码来做到这一点,或者我应该手动scipy使用和“修剪”它吗?.mean()

标签: pythonpandasdataframestatisticsmean

解决方案


当然,您可以使用GroupBy.agg

test_df['extra_col'] = (test_df['column'].str.split(expand=True)
                                         .stack().astype(str)
                                         .str.strip(string.punctuation)
                                         .map(test_dict)
                                         .astype(float)
                                         .groupby(level=0)
                                         .agg(stats.trim_mean, 0.1))

像传递 lambda 函数一样工作:

test_df['extra_col'] = (test_df['column'].str.split(expand=True)
                                         .stack().astype(str)
                                         .str.strip(string.punctuation)
                                         .map(test_dict)
                                         .astype(float)
                                         .groupby(level=0)
                                         .agg(lambda x: stats.trim_mean(x, 0.1)))
print (test_df)
  _id                               column  extra_col
0  1a                        und der in zu       20.0
1  2b        Kompliziertereswort something        NaN
2  3c                Lehrerin in zu [Buch]       15.0
3  4d  Buch (Lehrerin) kompliziertereswort        NaN

推荐阅读