python - 根据列值拆分数据框

标签 python numpy pandas

我有一个这样的数据框

 EndDate
2007-10-31              0
2007-11-30    -0.03384464
2007-12-31     -0.0336299
2008-01-31   -0.009448923
2008-02-29              0
2008-03-31    -0.05744962
2008-04-30     -0.0386942
2008-05-31              0
2008-06-30    -0.03624518
2008-07-31   -0.005286455
2008-08-31              0
2008-09-30     -0.1619864
2008-10-31     -0.2862122
2008-11-30     -0.2942793
2008-12-31     -0.2913253

现在我想在每次出现 0 后分割数据帧。 因此新的数据框应该如下所示:

Dataframe 1: 
    2007-11-30    -0.03384464
    2007-12-31     -0.0336299
    2008-01-31   -0.009448923
    2008-02-29              0

Dataframe 2:
    2008-03-31    -0.05744962
    2008-04-30     -0.0386942
    2008-05-31              0

Dataframe 3:
    2008-06-30    -0.03624518
    2008-07-31   -0.005286455
    2008-08-31              0

Dataframe 4:
    2008-09-30     -0.1619864
    2008-10-31     -0.2862122
    2008-11-30     -0.2942793
    2008-12-31     -0.2913253

我不知道如何做到这一点。 我可以迭代每一行寻找 0,但我认为应该有更好的方法。

最佳答案

首先,您可以通过将值列与零进行比较,然后计算这些 bool 值的累积和来创建组编号。

df['group_no'] = (df.val == 0).cumsum()
>>> df.head(6)
      EndDate       val  group_no
0  2007-10-31  0.000000         1
1  2007-11-30 -0.033845         1
2  2007-12-31 -0.033630         1
3  2008-01-31 -0.009449         1
4  2008-02-29  0.000000         2
5  2008-03-31 -0.057450         2

接下来,您可以将字典理解与 loc 结合使用来选择相关的 group_no 数据帧。为了获取最后一个组编号,我使用 iat 进行基于位置的索引来获取最后一个值。

d = {i: df.loc[df.group_no == i, ['EndDate', 'val']] 
     for i in range(1, df.group_no.iat[-1])}

>>> d
{1:       EndDate       val
 0  2007-10-31  0.000000
 1  2007-11-30 -0.033845
 2  2007-12-31 -0.033630
 3  2008-01-31 -0.009449, 
 2:       EndDate       val
 4  2008-02-29  0.000000
 5  2008-03-31 -0.057450
 6  2008-04-30 -0.038694, 
 3:       EndDate       val
 7  2008-05-31  0.000000
 8  2008-06-30 -0.036245
 9  2008-07-31 -0.005286}

编辑 正如 @DSM 所建议的,根据具有 15k 行的示例数据帧,使用 groupby 似乎快了约 6 倍。

d = {n: df2.ix[rows] 
     for n, rows in enumerate(df2.groupby('group_no').groups)}

关于python - 根据列值拆分数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33972303/

相关文章:

python - 强制转换为 Unicode : need string or buffer, int found - Django Rest Framework

python - python 中的 Countif() 单词

python - 坐标簇与沿单位向量 i 的点之间的最小距离

python - 当 A 列中的值低于 B 列时的计数频率

python - 带有时区感知索引的 pandas to_Datetime 转换

python - Cron 语法,MAC OS X

python - 大写字函数

python - 是否可以直接在ODBC连接字符串中指定驱动程序dll?

python - 在 nanmax 中指定轴时出现 Numpy 错误,而 nansum 在相同情况下工作

python-3.x - 如何使用带有要价和出价的 pandas 数据框计算成交量加权平均价格 (VWAP)?