我的CSV文件中有100行,我需要将它们分成10行,并对每个堆栈执行一些查询,因为有些行有特定的列,而有些行没有。
我该怎么做在熊猫?
1 blue 1 NaN
2 yellow 0 NaN
3 yellow 1 NaN
4 blue 1 NaN
5 blue 1 NaN
6 blue 0 NaN
7 yellow 1 NaN
8 yellow 1 NaN
9 yellow 1 NaN
10 blue 0 NaN
11 yellow NaN 1
12 blue NaN 1
13 yellow NaN 1
14 yellow NaN 0
15 blue NaN 1
16 yellow NaN 1
17 yellow NaN 0
18 blue NaN 1
19 blue NaN 0
20 blue NaN 1
我将PsychoPy用于神经科学任务,该任务有10个试验,因为PsychoPy将RT(反应时间)存储在不同的10列中,因此我需要访问它们,例如在其RTs为1的第一个试验中评估蓝色圆圈或第二次试用中的黄色圆圈,其RT为0。
最佳答案
我只是重新整理您的数据以便于访问。假设所有反应时间列之一都为空,则将它们加起来即可在单个列reaction_time
中获得非空值。然后通过trial
分配一个新的1 + df.index // trials
列。
现在,您可以使用.loc
通过reaction_time
和trial
访问color
数据。
# Sample data.
nan = np.nan
df = pd.DataFrame(
{'color': ['blue', 'yellow', 'yellow', 'blue', 'blue', 'blue', 'yellow', 'yellow', 'yellow', 'blue', 'yellow', 'blue', 'yellow', 'yellow', 'blue', 'yellow', 'yellow', 'blue', 'blue', 'blue'],
'num_1': [1, 0, 1, 1, 1, 0, 1, 1, 1, 0] + [nan] * 10,
'num_2': [nan] * 10 + [1, 1, 1, 0, 1, 1, 0, 1, 0, 1]}
)
# Summary data result.
trials = 10
reaction_time = df.iloc[:, 1:].sum(axis=1)
df2 = df[['color']].assign(
reaction_time=reaction_time,
trial=1 + df.index // trials,
)
>>> df2
color reaction_time trial
0 blue 1.0 1
1 yellow 0.0 1
2 yellow 1.0 1
3 blue 1.0 1
4 blue 1.0 1
5 blue 0.0 1
6 yellow 1.0 1
7 yellow 1.0 1
8 yellow 1.0 1
9 blue 0.0 1
10 yellow 1.0 2
11 blue 1.0 2
12 yellow 1.0 2
13 yellow 0.0 2
14 blue 1.0 2
15 yellow 1.0 2
16 yellow 0.0 2
17 blue 1.0 2
18 blue 0.0 2
19 blue 1.0 2
# Query data.
>>> df2.loc[df2.trial.eq(2) & df2.color.eq('yellow')]
color reaction_time trial
10 yellow 1.0 2
12 yellow 1.0 2
13 yellow 0.0 2
15 yellow 1.0 2
16 yellow 0.0 2
关于python - 如何在堆栈中拆分行并为 Pandas 中的每个单例执行“选择”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59584358/