Trimmed/truncated 表示数据框行中的内容

Trimmed/truncated mean for contents in a dataframe row

我有一个数据框和一本字典。数据框的一列包含句子。我想从句子中取出每个单词,检查它是否在字典中并为其赋值。计算值(每个句子或行)的 trimmed/truncated 平均值(其中我 trim 两端均为 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() 和“trim”?

当然,您可以使用 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