扩展熊猫数据框

时间:2019-03-04 14:21:22

标签: python pandas dataframe

我生成了一个熊猫数据框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。

我希望这些例子能说明我要实现的目标。

非常感谢您的帮助,非常感谢!

克里斯

2 个答案:

答案 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