gpt4 book ai didi

python - 找出 pandas 数据框中事件的中间出现的 "0"和第一次出现的 '' 1"

转载 作者:行者123 更新时间:2023-11-30 22:19:48 25 4
gpt4 key购买 nike

嗨,我有一个 pandas 数据框,其中还有事件列和其他列。我想在 id 上执行 group by 并在该 group by 上我想从所有连续 0 中取出 2 条记录我想找出连续 5 0 的模式可能更多,但它必须始终跟随 1 以及然后识别记录集,即连续 5 个 0,然后是下一个 1,然后获取中间行(这 5 个 0 组中的 0)记录,并找出这些 0 之后的第一个 1 并获取该行。但对于 0 秒,我应该重复 5 次或更多,然后从最后 5 次中取出中间行。

简而言之:我想要一组 0 和 1,条件是仅取 1,在上面您会发现连续 5 个 0 或更多,如果此模式是多次,则采用一个模式为每个具有 0 和 1 的 id 获取两条记录

例如。

 import pandas as pd
data={'id':[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
'name': ['a','b','c','d','e','f','g','h','i','j','k','l','m','n'
,'o','p','q','r','s','t','a1','b1','c1','d1','e1','f1','g1','h1','i1','j1','k1','l1','m1','n1'
,'o1','p1','q1','r1','s1','t1','aa','bb','cc','dd','ee','ff',
'gg','hh','ii','jj','kk','ll','mm','nn'
,'oo','pp','qq','rr','ss','tt','aa1','bb1','cc1','dd1','ee1','ff1',
'gg1','hh1','ii1','jj1','kk1','ll1','mm1','nn1'
,'oo1','pp1','qq1','rr1','ss1','tt1'],
'value':[0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0]}
df=pd.DataFrame.from_dict(data)

作为输出,我想为每个 id 获取 2 条记录,一条代表 0,一条代表 1。并且0行应该是连续5个或更多0的中间记录。

预期输出是:

    id  name    value

16 1 q 0
19 1 t 1

64 2 ee1 0
67 2 hh1 1

最佳答案

您可以使用数据透视表并为不同的值应用掩码来完成此操作。首先,我们应该按 idvalue 对进行分组:

df_grouped = df.reset_index().pivot_table(index=['id','value'],
values='name',
aggfunc=lambda x: ','.join(x)
).reset_index()


df_grouped['name'] = df_grouped['name'].str.split(',')

print(df_grouped)

id value name
0 1 0 a,b,d,e,f,g,h,i
1 1 1 c,j
2 2 0 l,m,n,o,p
3 2 1 k,q,r,s,t,u,w

然后选择每个 value==0id 对的零并保留中间值:

mask_zeros = ((df_grouped['value']==0)*
(df_grouped['name'].apply(len)>=5))
df_zeros = mask_zeros*df_grouped['name'].apply(
lambda x: x[int(np.ceil(.5*len(x)))]
if len(x)%2==1
else x[int(.5*len(x))])
print(df_zeros)

0 f
1
2 o
3

并选择每个 value==1id 对的第一个名称:

mask_ones = (df_grouped['value']==1)
df_ones = mask_ones*df_grouped['name'].apply(
lambda x: x[0] if len(x)>0 else None)

print(df_ones)

0
1 c
2
3 k

然后通过分配仅保留选定的名称:

 df_grouped['name'] = df_ones + df_zeros

df_grouped = df_grouped.merge(df.reset_index(),
on=['name','value','id']
).set_index('index')
print(df_grouped)

id value name
index
5 1 0 f
2 1 1 c
14 2 0 o
10 2 1 k

关于python - 找出 pandas 数据框中事件的中间出现的 "0"和第一次出现的 '' 1",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48992868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com