Python 对行条目进行计数以调整不同的列,包括

Python 对行条目进行计数以调整不同的列,包括,python,pandas,mean,Python,Pandas,Mean,我试图通过计算不同列中行条目的频率来更新列条目。这是我的数据样本。实际数据包括10k个样本,每个样本的长度为220。(220秒) 每秒只能注册靶心或射击 计数1:ID=a12和ID=v55分别为3和 Count2:count1结尾到第二个df.A_Shot==1的df.A_Bullseye==1,df[df.ID='a12']的1和2的df[df.ID='v55'] 其中,count(i)中的i是df.groupby(by='ID')[A\u Bull\u Total].max()。这里的i是2

我试图通过计算不同列中行条目的频率来更新列条目。这是我的数据样本。实际数据包括10k个样本,每个样本的长度为220。(220秒)

每秒只能注册靶心或射击

计数1:ID=a12和ID=v55分别为
3和

Count2:count1结尾到第二个
df.A_Shot==1的
df.A_Bullseye==1
df[df.ID='a12']
1
2的df[df.ID='v55']

其中,
count(i)
中的
i
df.groupby(by='ID')[A\u Bull\u Total].max()。这里的
i
2

因此,如果我可以计算每个I的平均计数,那么我将能够使用上述计数的平均值来调整df.Exp_A的值

mask_A_Shot= df.A_Shot == 1
mask_A_Bullseye= df.A_Bulleseye == 0
mask = mask_A_Shot  & mask_A_Bulleseye 
df[mask.groupby(df['ID'])].mean()

理想情况下,我希望每个I(斗牛士)都有类似的东西,需要多少次投篮,需要多少秒

使用
.cumsum
在每个ID内创建一个
Bullseye
的分组键,然后您可以找到有多少次射击,以及两次射击之间经过了多少时间

import pandas as pd

df['freq'] = pd.to_timedelta(df.freq, unit='s')
df['Bullseye'] = df.groupby('ID').A_Bullseye.cumsum()+1

# Chop off any shots after the final bullseye
m = df.Bullseye <= df.groupby('ID').A_Bullseye.transform(lambda x: x.cumsum().max())

df[m].groupby(['ID', 'Bullseye']).agg({'A_Shot': 'sum', 
                                       'freq': lambda x: x.max()-x.min()})

编辑:

鉴于你的评论,以下是我将如何进行。我们将
.shift
牛眼列,因此,我们不增加牛眼处的计数器,而是在牛眼之后的行中增加计数器。我们将修改
A_Shot
,因此斗牛士也被视为射击

df['freq'] = pd.to_timedelta(df.freq, unit='s')
df['Bullseye'] = df.groupby('ID').A_Bullseye.apply(lambda x: x.shift().cumsum().fillna(0)+1)

# Also consider Bullseye's as a shot:
df.loc[df.A_Bullseye == 1, 'A_Shot'] = 1

# Chop off any shots after the final bullseye
m = df.Bullseye <= df.groupby('ID').A_Bullseye.transform(lambda x: x.cumsum().max())

df1 = (df[m].groupby(['ID', 'Bullseye'])
            .agg({'A_Shot': 'sum', 
                  'freq': lambda x: (x.max()-x.min()).total_seconds()}))
现在,由于
freq
是一个整数秒数,您可以轻松地进行除法:

df1.A_Shot / df1.freq

#ID   Bullseye
#a12  1.0         1.0
#     2.0         2.0
#v55  1.0         1.5
#     2.0         1.0
#dtype: float64

感谢您优雅的解决方案!但是,考虑到实际数据的大小(超过10k的唯一ID),是否还有其他方法,比如说,计算每个靶场总共需要多少次射击/时间?所以我会得到每个斗牛士的平均数字?@A.Z我当然能帮上忙。我的一个问题是,当
'A_bullseye'
为1时,这是一个单独的镜头,已注册为一个bullseye,还是只是前一个镜头在下一秒注册为一个bullseye?例如,
a12
是在3秒内拍了3张(第三张是靶心),还是拍了3张不是靶心的照片,然后00:00:04的第4张照片是靶心?第二张照片,3张不是靶心的照片,然后00:00:04的第4张照片是靶心。很抱歉有歧义。@A.Z.我修改了答案,这样应该更符合您的需要。时间可能不是你想要的。例如,我将00:00:05-00:00:06计算为1秒,但由于这代表了整整2秒的动作,您可能只想将
1
添加到freq列中,以获得更精确的计时。@a.Z为此,您可以使用
.groupby
,按索引的bullsey级别进行分组:
df1.groupby(level=1.agg('mean'))
将为您提供所有ID中每个靶心的平均频率和射击次数
df['freq'] = pd.to_timedelta(df.freq, unit='s')
df['Bullseye'] = df.groupby('ID').A_Bullseye.apply(lambda x: x.shift().cumsum().fillna(0)+1)

# Also consider Bullseye's as a shot:
df.loc[df.A_Bullseye == 1, 'A_Shot'] = 1

# Chop off any shots after the final bullseye
m = df.Bullseye <= df.groupby('ID').A_Bullseye.transform(lambda x: x.cumsum().max())

df1 = (df[m].groupby(['ID', 'Bullseye'])
            .agg({'A_Shot': 'sum', 
                  'freq': lambda x: (x.max()-x.min()).total_seconds()}))
              A_Shot  freq
ID  Bullseye              
a12 1.0            4   4.0
    2.0            2   1.0
v55 1.0            3   2.0
    2.0            3   3.0
df1.A_Shot / df1.freq

#ID   Bullseye
#a12  1.0         1.0
#     2.0         2.0
#v55  1.0         1.5
#     2.0         1.0
#dtype: float64