gpt4 book ai didi

python - Itertools : selecting in pandas based on previous three rows, 或列表中的前一个元素

转载 作者:行者123 更新时间:2023-12-01 05:02:45 27 4
gpt4 key购买 nike

希望得到一些帮助来解决困扰我一整天的问题。我有一项实验的数据,在该实验中,受试者被要求通过屏幕按下键盘上的四个按钮之一——“m”、“x”、“n”、“z”——进行 1600 次试验。在偶数试验中,按下按钮遵循随机选择的模式(例如 mnzxmnzxmnzx),但在奇数试验中,按下的按钮是随机选择的。我得到的数据集仅包含受试者在哪个试验中按下的键。我需要找出:

(1) 主题的模式是什么。 (我尝试过这个,因为模式重复)

def find_pattern(df):
'''find the pattern for this subject'''
criterion = df['trial'].isin([1, 3, 5, 7])
the_pattern = df[criterion].circle_key.tolist()
return df


df = df.groupby('sid').apply(find_pattern)

(2) 找出该主题模式的可能组合是什么(即,如果我按“m”,下一个模式元素将是“x”)

为此,我尝试了一堆不同的 itertools,但没有一个完全按照我想要的方式工作。我基本上想列出 list :

 ['m', 'x', 'z', 'n'] 

对于我在(1)中得到的每个,并按顺序执行两个的所有可能组合。所以这将是:

 [('m', 'x'), ('x', 'z'), ('z', 'n'), ('n', 'm')]

并且没有其他可能性。然后,我想创建一个列,从最后三个试验(包括当前的试验)中生成一个三元组,如下面的三元组列所示。我觉得必须有某种滚动窗口,或者选择最后三个试验的简单方法。我尝试过各种错误的方法 - 我似乎无法弄清楚如何引用数据框中的“当前”行(不使用 for 列表)...

我需要这些值,因为我需要比较三元组的第一个和最后一个元素是否是可能的组合之一(possible_comb)。 (因此对于试验 3,答案将为 TRUE,而试验 4 的答案将为 FALSE)。

任何帮助将不胜感激。我当前的数据如下所示:

trial sid key
1 1 'm'
2 1 'm'
3 1 'x'
4 1 'n'
5 1 'x'
6 1 'x'
7 1 'n'
1 2 'm'
2 2 'm'
... ...

我希望它看起来像这样:

trial sid key    pattern               possible_comb                                 triplet
1 1 'm' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] NaN
2 1 'm' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] NaN
3 1 'x' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] ['m', 'm', 'x']
4 1 'n' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] ['m', 'x', 'n']
5 1 'x' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] ['x', 'n', 'x']
6 1 'x' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] ['n', 'x', 'x']
7 1 'n' ['m', 'x', 'x', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] ['x', 'x', 'n']
1 2 'n' ['n', 'x', 'm', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] NaN
2 2 'm' ['n', 'x', 'm', 'n'] [('m','x'), ('x','x'), ('x','n'), ('n', 'm')] NaN
... ...

最佳答案

要获得“模式”,您只需对主题 ID 进行分组并获取所有其他元素。可以这样做:

>>> d.groupby('sid')['key'].apply(lambda c: list(c[::2]))
sid
1 ['m', 'x', 'x', 'n']

(我截断了您的示例,仅包含一个主题,因为您仅包含主题 2 的部分数据,该数据太短,无法形成这样的“模式”。因此,这是主题 1 的模式。)

如果您想在相应主题的原始 DataFrame 的每一行中复制该数据,请使用 map 获取每个主题 ID 的模式:

>>> d['pattern'] = d.sid.map(d.groupby('sid')['key'].apply(lambda c: list(c[::2])))
>>> d
trial sid key pattern
0 1 1 'm' ['m', 'x', 'x', 'n']
1 2 1 'm' ['m', 'x', 'x', 'n']
2 3 1 'x' ['m', 'x', 'x', 'n']
3 4 1 'n' ['m', 'x', 'x', 'n']
4 5 1 'x' ['m', 'x', 'x', 'n']
5 6 1 'x' ['m', 'x', 'x', 'n']
6 7 1 'n' ['m', 'x', 'x', 'n']

要获得顺序组合,您只需将第一个元素添加到末尾(以便序列“循环”),然后通过抓取两个元素的子列表来提取组合,函数如下:

def getCombs(pattern):
pattern = pattern + [pattern[0]]
return [pattern[ix:ix+2] for ix in xrange(len(pattern)-1)]

然后您可以将模式放入 DataFrame 中:

>>> d['combs'] = d.pattern.map(getCombs)
>>> d.combs
0 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
1 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
2 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
3 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
4 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
5 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
6 [['m', 'x'], ['x', 'x'], ['x', 'n'], ['n', 'm']]
Name: combs, dtype: object

(我在这里只显示“梳子”列,因为包含所有列会使其太宽而无法舒适地显示。)

关于python - Itertools : selecting in pandas based on previous three rows, 或列表中的前一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25715627/

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