当前位置: 首页 > 知识库问答 >
问题:

Python:跨类别应用函数并将结果保存到新列

宗弘扬
2023-03-14

我是Python新手。我在分析脑电图数据。我已经创建了函数extract_bands,用于计算EEG频带的值(基于此答案),但在跨类别应用该函数并将聚合数据保存到新数据集中时遇到了问题

这是一个简化的数据集,pddf

import pandas as pd 
import numpy as np  


simple_df = {'subject': ['s1','s1','s1','s1','s1','s1','s2','s2','s2','s2','s2','s2','s3','s3','s3','s3','s3','s3','s4','s4','s4','s4','s4','s4'],
        'group': ['a','a','a','a','a','a','a','a','a','a','a','a','c','c','c','c','c','c','c','c','c','c','c','c'], 
        'trial': ['1','1','2','2','4','4','2','2','3','3','5','5','1','1','2','2','3','3','3','3','5','5','6','6'],
                'cond': ['c1','c1','c1','c1','c2','c2','c1','c1','c2','c2','c2','c2','c2','c2','c1','c1','c1','c1','c2','c2','c1','c1','c2','c2'],
             'value': [ 8.88260935, 82.97797122, 18.26659492,  7.70070742, 12.76417463,
       68.35936355,  7.59613253, 54.36616722,  9.11860667, 24.20324845,
       86.1674253 , 99.96479613, 40.83798898, 23.72822971, 49.77969641,
        2.19459866, 30.3883309 , 46.75944945, 11.47003917, 26.71771771,
       88.93251086,  7.29166478,  7.76880683, 40.65701944]
        }

pddf = pd.DataFrame(simple_df, columns = ['subject', 'group', 'trial', 'cond', 'value'])

下面是函数提取\u波段

# define frequency
fs = 256 

# define EEG bands
eeg_bands = {'Delta': (0, 4),
             'Theta': (4, 8),
             'Alpha': (8, 12),
             'Beta': (12, 30),
             'Gamma': (30, 45)}

def extract_bands (data):
    fft_vals = np.absolute(np.fft.rfft(data))
    fft_freq = np.fft.rfftfreq(len(data), 1.0/fs)
    eeg_band_fft = dict()
    for band in eeg_bands:  
        freq_ix = np.where((fft_freq >= eeg_bands[band][0]) & 
                       (fft_freq <= eeg_bands[band][1]))[0]
        eeg_band_fft[band] = np.mean(fft_vals[freq_ix])
    return eeg_band_fft

我可以将该函数应用于一次试验,并获得保存在字典中的EEG频带值,EEG\u band\u fft。在真实数据集中,每个试验有256个样本;这里一次试验只有2个样本,因此函数只返回Delta带的值。

one_trial = pddf[(pddf.subject == "s1") & (pddf.cond == 'c1') & (pddf.trial == '1')]

print(one_trial)
#>   subject group trial cond      value
#> 0      s1     a     1   c1   8.882609
#> 1      s1     a     1   c1  82.977971

extract_bands(one_trial.value)

#> {'Delta': 91.86058057, 'Theta': nan, 'Alpha': nan, 'Beta': nan, 'Gamma': nan}

问题

现在,对于每个受试者,我如何在属于相同条件cond的试验中应用功能extract_bands

基本上,我想返回一个数据集,其中每个cond每个主题都有一行,总共有八列:“主题”、“组”、“cond”以及字典EEG\u band\u fft中五个EEG频带的值。

实例

下面的代码使用groupby实现了我想要的功能(用于计算avarages),但我不知道如何使用函数extract\u bands实现它。

pddf2 = pddf.groupby(["subject", "group", "cond"]).value.mean() # take the mean
pddf2
#> subject  group  cond
s1       a      c1      29.456971
                c2      40.561769
s2       a      c1      30.981150
                c2      54.863519
s3       c      c1      32.280519
                c2      32.283109
s4       c      c1      48.112088
                c2      21.653396
Name: value, dtype: float64

创建于2021-05-26由reprexpy包


共有1个答案

羊舌承颜
2023-03-14

如果要在数据帧上执行自定义聚合,应使用函数agg并指定自定义函数。然后,您应该将dict列转换为一个数据帧,最后连接两个数据帧。

我会这样做:

dfg = (pddf.groupby(["subject", "group", "cond"])
        .agg({'value' : lambda x: extract_bands(x)})
        .reset_index()
)
df_dict = pd.DataFrame.from_records(dfg['value'])
result = pd.concat([dfg.drop(columns=['value']), df_dict], axis=1)

此代码返回以下DataFrame:

subject group cond       Delta  Theta  Alpha  Beta  Gamma
0      s1     a   c1  117.827883    NaN    NaN   NaN    NaN
1      s1     a   c2   81.123538    NaN    NaN   NaN    NaN
2      s2     a   c1   61.962300    NaN    NaN   NaN    NaN
3      s2     a   c2  219.454077    NaN    NaN   NaN    NaN
4      s3     c   c1  129.122075    NaN    NaN   NaN    NaN
5      s3     c   c2   64.566219    NaN    NaN   NaN    NaN
6      s4     c   c1   96.224176    NaN    NaN   NaN    NaN
7      s4     c   c2   86.613583    NaN    NaN   NaN    NaN
 类似资料:
  • 我需要置换一个数组并将每个排列保存在arrayList中,我使用递归方法,但它只重复保存一个结果。

  • 问题内容: import csv 我得到奇怪的输出!此代码有什么问题? 问题答案: 用途:

  • 本文向大家介绍python制作爬虫并将抓取结果保存到excel中,包括了python制作爬虫并将抓取结果保存到excel中的使用技巧和注意事项,需要的朋友参考一下 学习Python也有一段时间了,各种理论知识大体上也算略知一二了,今天就进入实战演练:通过Python来编写一个拉勾网薪资调查的小爬虫。 第一步:分析网站的请求过程 我们在查看拉勾网上的招聘信息的时候,搜索Python,或者是PHP等等

  • 问题内容: CREATE TABLE logistics ( id int primary key, campaign VARCHAR(255), event_type VARCHAR (255), date_offered VARCHAR (255), date_ordered DATE, date_delivered DATE, date_recorded DATE, date_complet

  • 假设我有一个这样的数据集 和一个函数,它接受输入变量A和B,但它沿着维度工作,只接受形状的数组,并输出形状

  • 这是im可以使用Python3通过API访问的数据预览。 我能够使用json.dumps(variablename)将其转储并使其成为一个json对象,但如何将其保存为一个json文件呢?