【问题标题】:How do I create a dataframe from another dataframe with only the last non negative values?如何从另一个只有最后一个非负值的数据框创建数据框?
【发布时间】:2021-05-30 00:25:10
【问题描述】:

我有一个像这样的多索引数据框:

          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 

【问题讨论】:

  • 我更改了问题的措辞,希望能更清楚。
  • “最新”是什么意思? :) 只需 df1 = df.loc[(df['value'] > 0) & (df['Year']>2000)]df1 = df.loc[df['value'] > 0],然后 df1.sort_values('year') 按年订购

标签: python pandas dataframe vectorization multi-index


【解决方案1】:

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

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

如果不能保证年份按升序排序,请链接到sort_values

new_df = df[m].sort_values('year').groupby(level=0).last()

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)

【讨论】:

  • 哇!我可以一次对多个列执行此操作吗,如果说我有几个值列,即 value1、value2、value3... 等?
  • 喜欢,这样可以吗:m = df[['value','value1','value2']]].ge(0) new_df = df[m].groupby(level=0) .last()
  • 我的意思是,是吗?这有点取决于您一次对多个列执行此操作的意思。您可以向蒙版添加任何您想要的条件,它会起作用。因此,例如,如果您想要 value1 为正的最后一行 AND value2 为正 m = df['value1'].ge(0) & df['value2'].ge(0) 将起作用。
  • 不,您必须使用一些额外的布尔逻辑。上面列出的&m = df[['value1', 'value2']].ge(0).all(axis=1) 都可以,但它应该可以工作。
  • 如果我想要每个值列独立于其他值列的最新非负值怎么办?这就是我的目标......
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多