我的 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 列中,所以我需要访问它们,例如在第一次试验中评估蓝色圆圈,他们的 RT 是 1 或第二次试验中的黄色圆圈,他们的 RT 为 0。
我只是重新组织您的数据以便于访问。 鉴于所有柱线之一的反应时间列都是空的,只需将它们相加以即可在单个列reaction_time
中得到非空值。 然后通过1 + df.index // trials
分配一个新的trial
列。
现在,您可以使用.loc
通过trial
和color
访问reaction_time
数据。
# 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
batches = [df.loc[i:i+10] for i in range(0, df.shape[0], 10)]
for batch in batches:
select_function()