Python 使用pandas中的groupby在所有组中查找条件的第一个实例

Python 使用pandas中的groupby在所有组中查找条件的第一个实例,python,pandas,loops,pandas-groupby,Python,Pandas,Loops,Pandas Groupby,我试图在每个组中找到满足条件的第一个实例,然后将不同的组合并在一起。在下面的数据中,我希望第一个实例在一个单独的列中显示为True,当数据中每个月的“putbuy”列从0变为1时,即1994-2018年 数据: month_x year_x day_x putbuy Desired putbuy 5977 2 2018 14 1 1 5978 2 2018 15 1 0 5979 2 2018 16

我试图在每个组中找到满足条件的第一个实例,然后将不同的组合并在一起。在下面的数据中,我希望第一个实例在一个单独的列中显示为
True
,当数据中每个月的“putbuy”列从0变为1时,即1994-2018年

数据:

month_x year_x  day_x   putbuy Desired putbuy
5977    2   2018    14  1           1
5978    2   2018    15  1           0
5979    2   2018    16  1           0
5980    2   2018    19  1           0
5981    2   2018    20  1           0
5982    2   2018    21  1           0
5983    2   2018    22  0           0
5984    2   2018    23  1           0  
5985    2   2018    26  0           0
5986    2   2018    27  1           0
5987    2   2018    28  0           0
5988    3   2018    1   0           0
5989    3   2018    5   0           0
5990    3   2018    6   0           0
5991    3   2018    7   0           0
5992    3   2018    8   0           0
5993    3   2018    9   0           0
5994    3   2018    12  0           0
5995    3   2018    13  0           0
5996    3   2018    14  0           0
5997    3   2018    15  0           0
5998    3   2018    16  0           0
5999    3   2018    19  1           1
6000    3   2018    20  1           0
6001    3   2018    21  0           0
6002    3   2018    22  1           0 
6003    3   2018    23  1           0
6004    3   2018    26  1           0
6005    3   2018    27  0           0
6006    3   2018    28  0           0
解决方案尝试:

grouped=options.groupby(['month_x','year_x'])

for group in grouped:
   while 'Close_x'>'pstrike':
       putb=0
    else:
        putb=1
    break       

    print(group)
我的数据集快照:

# create a copy of data
tmp_df = options.copy()

# take diff from previous day
tmp_df.loc[:, 'putbuy_change'] = tmp_df.groupby(['month_x', 'year_x']).putbuy.diff(1)

# keep rows where change is 1
keep = tmp_df[tmp_df.putbuy_change == 1]

# keep first instance of each month
first_ins = keep.groupby(['month_x', 'year_x']).head(1)

# add desired boolean indicator
first_ins.loc[:, 'result_col'] = True

# merge back onto data
result_df = options.merge(first_ins[['month_x', 'year_x', 'day_x', 'result_col']], on=['month_x', 'year_x', 'day_x'], how='left')

IIUC,您可以使用
idxmax
查找“putbuy”最大值首次出现的索引:

df.loc[df.groupby(['year_x','month_x'])['putbuy'].idxmax(),'DO'] = 1
df['DO'] = df.DO.fillna(0).astype(int)

print(df)
输出:

      month_x  year_x  day_x  putbuy  Desired putbuy  DO
5977        2    2018     14       1               1   1
5978        2    2018     15       1               0   0
5979        2    2018     16       1               0   0
5980        2    2018     19       1               0   0
5981        2    2018     20       1               0   0
5982        2    2018     21       1               0   0
5983        2    2018     22       0               0   0
5984        2    2018     23       1               0   0
5985        2    2018     26       0               0   0
5986        2    2018     27       1               0   0
5987        2    2018     28       0               0   0
5988        3    2018      1       0               0   0
5989        3    2018      5       0               0   0
5990        3    2018      6       0               0   0
5991        3    2018      7       0               0   0
5992        3    2018      8       0               0   0
5993        3    2018      9       0               0   0
5994        3    2018     12       0               0   0
5995        3    2018     13       0               0   0
5996        3    2018     14       0               0   0
5997        3    2018     15       0               0   0
5998        3    2018     16       0               0   0
5999        3    2018     19       1               1   1
6000        3    2018     20       1               0   0
6001        3    2018     21       0               0   0
6002        3    2018     22       1               0   0
6003        3    2018     23       1               0   0
6004        3    2018     26       1               0   0
6005        3    2018     27       0               0   0
6006        3    2018     28       0               0   0

IIUC,您可以使用
idxmax
查找“putbuy”最大值首次出现的索引:

df.loc[df.groupby(['year_x','month_x'])['putbuy'].idxmax(),'DO'] = 1
df['DO'] = df.DO.fillna(0).astype(int)

print(df)
输出:

      month_x  year_x  day_x  putbuy  Desired putbuy  DO
5977        2    2018     14       1               1   1
5978        2    2018     15       1               0   0
5979        2    2018     16       1               0   0
5980        2    2018     19       1               0   0
5981        2    2018     20       1               0   0
5982        2    2018     21       1               0   0
5983        2    2018     22       0               0   0
5984        2    2018     23       1               0   0
5985        2    2018     26       0               0   0
5986        2    2018     27       1               0   0
5987        2    2018     28       0               0   0
5988        3    2018      1       0               0   0
5989        3    2018      5       0               0   0
5990        3    2018      6       0               0   0
5991        3    2018      7       0               0   0
5992        3    2018      8       0               0   0
5993        3    2018      9       0               0   0
5994        3    2018     12       0               0   0
5995        3    2018     13       0               0   0
5996        3    2018     14       0               0   0
5997        3    2018     15       0               0   0
5998        3    2018     16       0               0   0
5999        3    2018     19       1               1   1
6000        3    2018     20       1               0   0
6001        3    2018     21       0               0   0
6002        3    2018     22       1               0   0
6003        3    2018     23       1               0   0
6004        3    2018     26       1               0   0
6005        3    2018     27       0               0   0
6006        3    2018     28       0               0   0

请以文本形式发布数据框。我无法在数据帧的图像上测试我的解决方案。你好,Aran,我尝试复制粘贴笔记本的输出,但它看起来不整洁,不管怎样,你可以假设任何带有列“putbuy”的时间序列数据,该列根据条件为1或0。我想要第一个实例,在数据集的每个月(1994-2018),在“putbuy”列中将0变为1。你能帮我抓住第一个例子吗。如果还需要什么,请告诉我。谢谢。@JD_Trader,请发布您所需的数据集谢谢格式化我的问题,我已经说明了所需的输出。如果我正确理解了问题,如何在每个组中对putbuy列进行diff(1),然后保留diff==1的所有行,再做一次分组,并保留每组的第一行?请以文本形式发布您的数据框。我无法在数据帧的图像上测试我的解决方案。你好,Aran,我尝试复制粘贴笔记本的输出,但它看起来不整洁,不管怎样,你可以假设任何带有列“putbuy”的时间序列数据,该列根据条件为1或0。我想要第一个实例,在数据集的每个月(1994-2018),在“putbuy”列中将0变为1。你能帮我抓住第一个例子吗。如果还需要什么,请告诉我。谢谢。@JD_Trader,请发布您所需的数据集谢谢格式化我的问题,我已经说明了所需的输出。如果我正确理解了问题,如何在每个组中对putbuy列进行diff(1)运算,然后保留diff==1的所有行,然后再次进行groupby运算并保留每个组的第一行?