我是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包
如果要在数据帧上执行自定义聚合,应使用函数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文件呢?