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运算并保留每个组的第一行?