在Pandas中对DataFrame进行排序和切片

时间:2019-05-15 13:50:48

标签: python pandas slice

我有一个如下所示的数据框:

    detaildate  detailquantity
0   2012-02-09  7.0
1   2011-05-27  -1.0
2   2011-05-04  -2.0
3   2012-03-19  -2.0
4   2012-03-18  -3.0

我想首先按detaildate对上面的数据帧进行排序,然后将数据帧从detailquantity的第一个正值切到最后一个索引。

结果数据框应如下所示:

    detaildate  detailquantity
0   2012-02-09  7.0
4   2012-03-18  -3.0
3   2012-03-19  -2.0

我正在尝试下面的代码,但是最后导致一个空的数据框,我无法弄清楚为什么

df.sort_values(by='detaildate', inplace=True)
df = df[df[df['detailquantity'] > 0].first_valid_index():]

上面的代码有什么问题?

1 个答案:

答案 0 :(得分:2)

Series.cumsum与布尔掩码一起使用,并测试所有大于0的值,如果所有负值,则解决方案也可以正常工作:

df.sort_values(by='detaildate', inplace=True)

df = df[(df['detailquantity'] > 0).cumsum() > 0]
print (df)
   detaildate  detailquantity
0  2012-02-09             7.0
4  2012-03-18            -3.0
3  2012-03-19            -2.0

应该通过创建唯一索引来更改您的解决方案,但必须至少匹配一个值:

df.sort_values(by='detaildate', inplace=True)
df = df.reset_index(drop=True)

df = df.loc[(df['detailquantity'] > 0).idxmax():]
print (df)
   detaildate  detailquantity
2  2012-02-09             7.0
3  2012-03-18            -3.0
4  2012-03-19            -2.0

numpy中的另一种选择:

df.sort_values(by='detaildate', inplace=True)

df = df.iloc[(df['detailquantity'].values > 0).argmax():]
print (df)
   detaildate  detailquantity
0  2012-02-09             7.0
4  2012-03-18            -3.0
3  2012-03-19            -2.0