有一个熊猫数据帧列表,如何将它们连接在一起成为一个groupby对象,以对其进行矢量化计算?
df很相似,并且在合并后没有机会对其进行分组。
第n组:
index some_values
0 2
1 3
2 2
3 2
第n + 1组:
index some_values
6 1
7 4
8 4
我可以在列表中循环添加一个标识符,但是由于这个操作是另一个循环的一部分,因此我必须避免这个内部循环。
以另一种方式提出问题:如何向列表中DF的行中添加带有累加的标识符,以避免循环操作?
我实际上是如何到达那里的故事:
首先,我有一个布尔DF分解为Trues
和组Falses
:
initial_df
:
index boolean
0 False
1 False
2 False
3 True
4 True
5 False
6 False
7 False
8 False
9 False
我用这个截图得到了我需要的groupes
中的dfs
:
https://stackoverflow.com/questions/57132096/pandas-how-to-groupby-based-on-series-pattern
x = listing_calendar[~listing_calendar["available"]].index.values
groups = np.split(x, np.where(np.diff(x)>1)[0]+1)
grouped_dfs = [listing_calendar.iloc[gr, :] for gr in groups]
grouped_dfs[0]
:
index boolean
0 False
1 False
2 False
grouped_dfs[2]
:
index boolean
5 False
6 False
7 False
8 False
9 False
预期df进一步groupby
:
index boolean group_id
0 False 0
1 False 0
2 False 0
3 True
4 True
5 False 1
6 False 1
7 False 1
8 False 1
9 False 1
或由groupby
插入的grouped_dfs
对象可以使用
谢谢!
答案 0 :(得分:3)
您可以使用类似的内容:
s=np.where(~df.boolean,df.boolean.ne(df.boolean.shift()).cumsum(),np.nan)
final=df.assign(group=pd.Series(pd.factorize(s)[0]+1).replace(0,np.nan))
index boolean group
0 0 False 1.0
1 1 False 1.0
2 2 False 1.0
3 3 True NaN
4 4 True NaN
5 5 False 2.0
6 6 False 2.0
7 7 False 2.0
8 8 False 2.0
9 9 False 2.0
详细信息:
使用np.where()
和~
取反,并使用df.boolean.ne(df.boolean.shift()).cumsum()
将相同系列的移位值进行比较:
np.where(~df.boolean,df.boolean.ne(df.boolean.shift()).cumsum(),np.nan)
#array([ 1., 1., 1., nan, nan, 3., 3., 3., 3., 3.])
然后使用factorize()
为NaN
返回-1。在此之后我们执行+1,然后用np.nan
替换0。