df=pd.DataFrame({"C1":['USA','USA','USA','USA','USA','JAPAN','JAPAN','JAPAN','USA','USA'],'C2':['A','B','A','A','A','A','A','A','B','A']})
C1 C2
0 USA A
1 USA B
2 USA A
3 USA A
4 USA A
5 JAPAN A
6 JAPAN A
7 JAPAN A
8 USA B
9 USA A
这是我的问题的一个水版本,所以为了简单起见,我的目标是迭代数据帧的一个子组,其中 C2 包含 B。如果 B 在 C2 中 - 我查看 C1 并需要整个组。所以在这个例子中,我看到 USA 并且它从索引 0 开始到 4 结束。另一个是在 8 和 9 之间。所以我想要的结果是这样的索引:
[[0,4],[8,9]]
我尝试使用 groupby 但它不起作用,因为它将所有美国组合在一起my_index = list(df[df['C2']=='B'].index)
my_index
会给 1,8 但如何开始/结束?
最佳答案
这是一种方法,您可以首先屏蔽至少具有 1 B
的组上的数据帧,然后抓取索引并创建一个辅助列来聚合第一个和最后一个索引值:
s = df['C1'].ne(df['C1'].shift()).cumsum()
i = df.index[s.isin(s[df['C2'].eq("B")])]
p = np.where(np.diff(i)>1)[0]+1
split_ = np.split(i,p)
out = [[i[0],i[-1]] for i in split_]
print(out)
[[0, 4], [8, 9]]
关于python - 如何获取数据帧的子组开始完成索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67150765/