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)