python - 在 python 中,如何限制每个 gvkey 插入虚拟一次?

标签 python pandas loops for-loop

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

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。 抱歉,我没有任何关于这样做的想法,但我只是不知道如何做。

最佳答案

使用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

关于python - 在 python 中,如何限制每个 gvkey 插入虚拟一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62652761/

相关文章:

javascript - 在 .onclick 函数的方法中调用选定的循环元素

python - Tornado :如何创建写入 RequestHandler 的类文件对象?

python - 如何查找数据框操作的两个日期之间的天数

python - 将字符串安装到预定的模式中?

python - Pandas :在散点图中使用颜色

C - 使用指针创建更高效​​的循环来遍历字母表

python - 将具有字典值的系列值转换为 DataFrame。不是系列本身

python - 如何在python中将一个元素从列表移动到另一个元素

python - 为什么这个 `try` 语句没有捕获这个 `CannotSendRequest` 错误? Python

c# - 更快的循环方法 ('for' 和 'foreach' )?