我有一个数据框
import pandas as pd
import numpy as np
v1=list(np.random.rand(30))
v2=list(np.random.rand(30))
mydf=pd.DataFrame(data=zip(v1,v2),columns=['var1','var2'])
然后我在一些变量上应用了一些布尔条件
mydf['cond1']=mydf['var1']>0.2
mydf['cond2']=mydf['var1']>0.8
mydf['cond1']=
0 False
1 True
2 True
3 False
4 False
5 True
6 False
....
我想在'cond1'(或'cond2')为True的块中分组,并为每个组商店分组:
组的值:True / False
块的开始和结束的索引:例如 1,2 5,5
var2
的2个值在起点和终点的索引处,
开始索引和结束索引之间var1
的所有值,作为可迭代的(np.array列表)
这是返回值的一个示例:
summary=
'Start' 'End' 'Start_var2' 'End_var2' 'Value' 'var1'
1 2 0.3217381 0.454543 True [0.25,0.26]
答案 0 :(得分:1)
我认为你可以使用this SO answer。 i
为您提供了组号,index
g
可用于获取var
值。
v1=list(np.random.rand(30))
v2=list(np.random.rand(30))
df=pd.DataFrame(data=zip(v1,v2),columns=['var1','var2'])
df['cond1']=df['var1']>0.2
df['cond2']=df['var1']>0.8
for i, g in df.groupby([(df['cond1'] != df['cond1'].shift()).cumsum()]):
print (i)
print (g)
print (g['cond1'].tolist())
print(g['cond1'].index[0])#can get var values from this
答案 1 :(得分:1)
IIUC,让我们尝试这样的事情:
mydf.groupby(mydf.cond1.diff().cumsum(), as_index=False)\
.apply(lambda x: pd.Series([x.iloc[0].name,
x.iloc[-1].name,
x.iloc[0]['var2'],
x.iloc[-1]['var2'],
x.iloc[0]['cond1'],
x.var1.tolist()],
index=['Start','End','Start_var2',
'End_var2','Value','var1']))
输出:
Start End Start_var2 End_var2 Value var1
0 1 13 0.580713 0.772878 True [0.9080110836630401, 0.34879731608699105, 0.63...
1 14 14 0.688374 0.688374 False [0.11739843719148924]
2 15 15 0.204304 0.204304 True [0.3010533582011998]
3 16 17 0.470689 0.808964 False [0.14526373397045378, 0.09218609736837002]
4 18 20 0.675035 0.087408 True [0.6029321967069232, 0.3641874497564469, 0.564...
5 21 21 0.346795 0.346795 False [0.1913357207205566]
6 22 29 0.944366 0.845753 True [0.6769058596527606, 0.2155054472756598, 0.278...