数据框行中内容的修剪/截断平均值

Posted

技术标签:

【中文标题】数据框行中内容的修剪/截断平均值【英文标题】:Trimmed/truncated mean for contents in a dataframe row 【发布时间】:2021-11-16 12:37:05 【问题描述】:

我有一个数据框和一个字典。数据框的一列包含句子。我想从句子中取出每个单词,检查它是否在字典中并将其值分配给它。计算值(每个句子或行)的修剪/截断平均值(我在两端修剪 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() 并手动“修剪”它?

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于数据框行中内容的修剪/截断平均值的主要内容,如果未能解决你的问题,请参考以下文章

使用其他行中的值将函数应用于熊猫数据框行

检查列中的值是不是存在于数据框行中的其他位置

计算截断对数正态分布的平均值

行中丢失数据的方法? [复制]

在每个 pandas 数据框行中查找前 n 个最高值列的名称

从 SQLite 中的所有行中减去平均值