在对pandas DataFrame进行子集化时避免循环

时间:2017-02-16 20:12:37

标签: python loops pandas numpy

我有一个pandas DataFrame df_R ,如下所示:

         Change       Date  SubsetCondId
0      0.000230 2015-02-13           868
1     -0.000080 2015-02-16           868
2      0.000380 2015-02-17           868
3     -0.000430 2015-02-13           679
4      0.000000 2015-02-16           679
5      0.000000 2015-02-17           679
6      0.004075 2015-02-13            10
7      0.000000 2015-02-16            10
8      0.001598 2015-02-17            10
9      0.015038 2015-02-13           937
10     0.000000 2015-02-16           937

为了创建一个新的DataFrame R ,将日期显示为索引,将 SubsetCondId 显示为列,我执行了以下操作:

factorsId = np.sort(df_R['SubsetCondId'].unique())
dates = np.sort(df_R['Date'].unique())
R = pd.DataFrame(index=dates, columns=factorsId)
for fac_id in factorsId:
    dates_id = df_R['Date'][df_R['SubsetCondId']==fac_id]
    R_id = np.array(df_R['Change'][df_R['SubsetCondId']==fac_id])
    R.loc[dates_id,fac_id] = R_id

R = R.fillna(value=0)

随着数据集变大,进程变慢。有没有不同的方法来处理这个问题,也许是一种矢量化方法?

2 个答案:

答案 0 :(得分:0)

使用set_index与pivot

结合使用
df_R = df_R.set_index('Date').pivot(columns = 'SubsetCondId')

答案 1 :(得分:-1)

您可以使用pivot方法将给定列设置为索引,将另一列中的值设置为shown here

df_R.pivot(index='Date',columns='SubsetCondId',values='Change')