Python 如何从另一个仅包含最后一个非负值的数据帧创建数据帧?

Python 如何从另一个仅包含最后一个非负值的数据帧创建数据帧?,python,pandas,dataframe,vectorization,multi-index,Python,Pandas,Dataframe,Vectorization,Multi Index,我有一个多索引数据帧,如下所示: year value some_other_column_i_dont_care_about one two a t 2000 0 aaa w 2001 3 bbb t 2002 -2 ccc b t 2000 4 ddd w 2001 7 eee t 2002

我有一个多索引数据帧,如下所示:

          year  value  some_other_column_i_dont_care_about
 one two     
 a   t     2000     0   aaa
     w     2001     3   bbb
     t     2002    -2   ccc
 b   t     2000     4   ddd
     w     2001     7   eee    
     t     2002    -8   fff
 c   t     2000    11   ggg
     w     2001   -12   hhh
     t     2002   -15   iii 
我如何创建一个新的单级df,它只有最近(以年为单位)的非负值,如下所示:

          year   value
 one    
 a        2001     3
 b        2001     7
 c        2000    11 

为大于或等于0的值创建布尔索引,然后使用:

如果年份不保证按升序排序,则以

new_df

     year  value
one             
a    2001      3
b    2001      7
c    2000     11

完整的工作示例:

import pandas as pd

df = pd.DataFrame({
    'one': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
    'two': ['t', 'w', 't', 't', 'w', 't', 't', 'w', 't'],
    'year': [2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002],
    'value': [0, 3, -2, 4, 7, -8, 11, -12, -15]
}).set_index(['one', 'two'])

m = df['value'].ge(0)
new_df = df[m].groupby(level=0).last()

print(new_df)

我改变了问题的措辞,希望能让问题更清楚。“最新”是什么意思只需执行
df1=df.loc[(df['value']>0)和(df['Year']>2000)]
df1=df.loc[df['value']>0]
,然后
df1.按年份排序值('Year')
!如果我有几个值列,即value1、value2、value3,我可以一次对多个列执行此操作吗。。。等等?比如,这是否有效:m=df[['value','value1','value2']].ge(0)new_df=df[m].groupby(level=0).last()我是说,是吗?这在某种程度上取决于您一次对多个列执行此操作的意思。你可以在面具上添加任何你想要的条件,它就会起作用。例如,如果您想要最后一行,其中value1为正,value2为正
m=df['value1'].ge(0)&df['value2'].ge(0)
可以工作。不,您必须使用一些额外的布尔逻辑。上面列出的
&
m=df[['value1','value2']].ge(0)。所有(axis=1)
都应该可以工作。如果我希望每个值列的最新非负值独立于其他值列,该怎么办?这是我的目标。。。。
     year  value
one             
a    2001      3
b    2001      7
c    2000     11
import pandas as pd

df = pd.DataFrame({
    'one': ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'],
    'two': ['t', 'w', 't', 't', 'w', 't', 't', 'w', 't'],
    'year': [2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002],
    'value': [0, 3, -2, 4, 7, -8, 11, -12, -15]
}).set_index(['one', 'two'])

m = df['value'].ge(0)
new_df = df[m].groupby(level=0).last()

print(new_df)