我生成了一个熊猫数据框df(请参见下面的示例)。下一步,我的任务是使用特定行和列中的值扩展此数据框,并生成一个新的数据框df2(请参见下面的示例)。 如何使用代码而不是手动生成df2?
import pandas as pd
df = pd.DataFrame([[0, 0, 45, 1, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 0, 45, 1, 0, 0, 0, 0, 0, 0],
[3, 0, 135, 2, 0, 0, 0, 0, 0, 0],
[4, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[5, 0, 135, 2, 0, 0, 0, 0, 0, 0]],
columns=['trial_nr', 'mini_block_nr', 'stimulus_nr', 'CorResp', 'SR0', 'SR1', 'SR2', 'SR3', 'SR4', 'SR5'])
print(df)
df2 = pd.DataFrame([[0, 0, 45, 1, 0, 45, 135, 0, 0, 0],
[1, 0, 0, 0, 0, 45, 135, 0, 0, 0],
[2, 0, 45, 1, 0, 45, 135, 0, 0, 0],
[3, 0, 135, 2, 0, 45, 135, 0, 0, 0],
[4, 0, 0, 0, 0, 45, 135, 0, 0, 0],
[5, 0, 135, 2, 0, 45, 135, 0, 0, 0]],
columns=['trial_nr', 'mini_block_nr', 'stimulus_nr', 'CorResp', 'SR0', 'SR1', 'SR2', 'SR3', 'SR4', 'SR5'])
print(df2)
例如,列SR0
代表与CorResp = 0和mini_block_nr = 0关联的stimulus_nr,在这种情况下stimulus_nr =0。同样,列SR1代表与CorResp = 1关联的stimulus_nr并且mini_block_nr = 0,在这种情况下为stimulus_nr = 45。
我希望这些例子能说明我要实现的目标。
非常感谢您的帮助,非常感谢!
克里斯
答案 0 :(得分:0)
嘿@Christina IIUC,这就是您要实现的目标:
for i in sorted(df.CorResp.unique()):
mask=(df.CorResp==i)&(df.mini_block_nr==0)
df['SR'+i]=df.loc[mask].stimulus_nr[0]
这将用您要查找的值填充DataFrame中的SR1
SR5
列。如果还有更多CorResp
个值,它将仍然有效。目前尚不清楚您是否需要更一般的答案,或者mini_block_nr
是否可以采用不同的值,因此我可以进行编辑
答案 1 :(得分:0)
一种方法是首先使用.pivot_table
获取与stimulus_nr
对应的所有CorResp
。之后,我们可以编写一个小循环来填充我们的列。
此方法的优点是没有硬编码。因此,如果您的数据框可能扩展到100个不同的值,那么仍然可以使用。
代码:
# First we pivot our table
pivot = df.pivot_table(values='stimulus_nr', columns='CorResp', index='trial_nr')
print(pivot)
CorResp 0 1 2
trial_nr
0 NaN 45.0 NaN
1 0.0 NaN NaN
2 NaN 45.0 NaN
3 NaN NaN 135.0
4 0.0 NaN NaN
5 NaN NaN 135.0
# Next for every column in pivot table we fill our corresponding SR columns
# While we do this, we fill our NaN to get values in each row.
for col in range(pivot.shape[1]):
df[f'SR{col}'] = pivot[col].fillna(method='bfill').fillna(method='ffill')
print(df)
Out[40]:
trial_nr mini_block_nr stimulus_nr CorResp SR0 SR1 SR2 SR3 SR4 \
0 0 0 45 1 0.0 45.0 135.0 0 0
1 1 0 0 0 0.0 45.0 135.0 0 0
2 2 0 45 1 0.0 45.0 135.0 0 0
3 3 0 135 2 0.0 45.0 135.0 0 0
4 4 0 0 0 0.0 45.0 135.0 0 0
5 5 0 135 2 0.0 45.0 135.0 0 0
SR5
0 0
1 0
2 0
3 0
4 0
5 0