拥有 pandas 数据帧列表,如何将它们连接到单个 groupby 对象中以对它们进行矢量化计算?
dfs 相似,连接后无法对它们进行分组。
组n:
index some_values
0 2
1 3
2 2
3 2
第 n+1 组:
index some_values
6 1
7 4
8 4
我可以循环遍历列表来添加标识符,但由于这个操作是另一个循环的一部分,我必须避免这个内部循环。
换个方式问问题:如何将带有 cumsum 的标识符添加到列表中的 DF 行中,避免循环操作?
我如何到达那里的故事:
首先,我有一个 bool 值 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
我使用这个狙击来获取我需要的dfs
的groupes
:
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
进一步groupby
的预期 df:
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
或插入grouped_dfs
的groupby
对象来使用
谢谢!
最佳答案
你可以使用类似的东西:
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。
关于pandas 要分组的数据框列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57163222/