gpt4 book ai didi

Python:字典键值对 Pandas 值的平均值

转载 作者:太空宇宙 更新时间:2023-11-03 14:31:19 24 4
gpt4 key购买 nike

我有一个相当复杂的数据结构,即 Pandas 数据框中的字典。假设我有这个数据框。

trials_ = [1,2,1,2]
stimul_ = [1,1,2,2]
data_ = [[{'peak_voltage': [30.5, 65], 'Spikecount': [2]}], [{'peak_voltage': [30.5, 65, 30], 'Spikecount': [3]}], [{'peak_voltage': [20.1], 'Spikecount': [1]}], 'NaN']
featve = pd.DataFrame({'trial': trials_, 'stimulus': stimul_, 'data': data_})
featve

data stimulus trial
0 [{'peak_voltage': [30.5, 65], 'Spikecount': [2]}] 1 1
1 [{'peak_voltage': [30.5, 65, 30], 'Spikecount'... 1 2
2 [{'peak_voltage': [20.1], 'Spikecount': [1]}] 2 1
3 NaN 2 2

我现在想要计算“数据”列中字典中每个关键元素的中位数和 25%/75% 四分位数(此处为 peak_VoltageSpikecount)对于所有试验中的每个刺激。

中位数的一个例子:我想要在所有试验中应用刺激 1 时的中值 peak_Voltage 值 [30.5, 65, 20.1] -> 30.5。当施加刺激二时也是如此 [30.5, 65, 30, NaN] -> 30.5。当然,Spikecount 也是如此。

说实话,我不知道从哪里开始。如果我只想计算中位数而不考虑模拟,我会简单地使用。

featve.data.median

但这不是我想要的。另外,如果我没有字典而只有数字,我会使用类似的东西

featve.groupby('stimulus').data.apply(np.nanmedian)  

但是在我的例子中,我可以用 panda 表中的字典做什么呢?

编辑1

我有 10 个刺激,每个刺激有 16 次试验,总共 160 行。这些字典是名为 EFEL 的工具箱的输出。我用它来查找数据轨迹的某些特征(例如神经元 Action 电位峰值的时间)。我决定将生成的 160 个字典组织在 panda 数据框中,以同时跟踪数据、刺激和试验。我不知道这是否是不幸的。

最佳答案

对于你所问的问题,我建议重组你的数据框架。而不是用以下方式构造 featve:

data_ = [[{'peak_voltage': [30.5, 65], 'Spikecount': [2]}], [{'peak_voltage': [30.5, 65, 30], 'Spikecount': [3]}], [{'peak_voltage': [20.1], 'Spikecount': [1]}], 'NaN']

data_ = {'peak_voltage': [30.5, 65, 30.5, 65, 30, 20.1, np.nan], 'Spikecount': [2,2,3,3,3,1, np.nan], 'trials': [1,1,2,2,2,1,2], 'stimulus': [1,1,1,1,1,2,2]}
featve = pd.DataFrame(data_)

结果是以下 DataFrame:

   Spikecount  peak_voltage  stimulus  trials
0 2.0 30.5 1 1
1 2.0 65.0 1 1
2 3.0 30.5 1 2
3 3.0 65.0 1 2
4 3.0 30.0 1 2
5 1.0 20.1 2 1
6 NaN NaN 2 2

在此 DataFrame 上,您可以像平常一样分组和计算中位数。

例如

featve.groupby('stimulus').peak_voltage.meadian()
stimulus
1 30.5
2 20.1
Name: peak_voltage, dtype: float64

更新

我理解对没有“好”数据的担忧。给定一个遵循 data_ 格式的严格构造,您可以使用 defaultdict获得更好的数据框。

dict_data = defaultdict(list)

for idx in range(len(data_)):
if isinstance(data_[idx], list):
for sub in data_[idx]:
repeats = len(sub['peak_voltage'])
data_dict['peak_voltage'] += sub['peak_voltage']
data_dict['Spikecount'] += sub['Spikecount'] * repeats
data_dict['trial'] += [trials_[idx]] * repeats
data_dict['stimulus'] += [stimul_[idx]] * repeats
else:
data_dict['peak_voltage'].append('NaN')
data_dict['Spikecount'].append('NaN')
data_dict['trial'] += [trials_[idx]]
data_dict['stimulus'] += [stimul_[idx]]

pd.DataFrame(data_dict)
Spikecount peak_voltage stimulus trial
0 2 30.5 1 1
1 2 65 1 1
2 3 30.5 1 2
3 3 65 1 2
4 3 30 1 2
5 1 20.1 2 1
6 NaN NaN 2 2

关于Python:字典键值对 Pandas 值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47267826/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com