【问题标题】:In python how to limit inserting a dummy to once per gvkey?在 python 中,如何限制每个 gvkey 插入一个虚拟对象一次?
【发布时间】:2020-10-20 11:31:29
【问题描述】:

我有以下代码,每次 notch_sp 从 11 或更高到 10 或更低时都会产生一个,但我只希望它在每个 gvkey 第一次发生时产生一个。

df['cliff']= (df['gvkey'].eq(df['gvkey'].shift()) &
              df['notch_sp'].shift().gt(10) &
              df['notch_sp'].lt(11)).view('i1')

对于如下所示的数据集:

df[['gvkey','notch_sp','am','cliff']]
Out[1]: 
            gvkey    notch_sp    am     cliff
1        1004.0        12.0    0.490      0
2        1004.0        10.0    0.490      1
3        1004.0        11.0    0.608      0
4        1004.0        10.0    0.608      1
5        329498.0      12.0      NaN      0
6        329498.0      10.0      NaN      1
7        329498.0      13.0      NaN      0
8        329498.0      10.0      NaN      1

因此,第 2 行和第 6 行的悬崖必须为 1,其他任何地方都必须为 0。 很抱歉,我对这样做的想法没有任何意见,但我不知道该怎么做。

【问题讨论】:

    标签: python pandas loops for-loop


    【解决方案1】:

    将GroupBy.cumsum 与1 比较用于第一组,并按& 将原始链接用于按位AND:

    df['cliff']= (df['gvkey'].eq(df['gvkey'].shift()) &
                  df['notch_sp'].shift().gt(10) &
                  df['notch_sp'].lt(11))
    df['cliff'] = (df.groupby('gvkey')['cliff'].cumsum().eq(1) & df['cliff']).view('i1')
    print (df)
          gvkey  notch_sp     am  cliff
    1    1004.0      12.0  0.490      0
    2    1004.0      10.0  0.490      1
    3    1004.0      11.0  0.608      0
    4    1004.0      10.0  0.608      0
    5  329498.0      12.0    NaN      0
    6  329498.0      10.0    NaN      1
    7  329498.0      13.0    NaN      0
    8  329498.0      10.0    NaN      0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2023-01-29
      相关资源
      最近更新 更多