주어진
import pandas as pd
df = pd.DataFrame({
"a": [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 2, 2, 3, 3, ],
})
print(df)
a 0 1 1 1 2 1 3 2 4 2 5 2 6 2 7 3 8 3 9 3 10 3 11 1 12 1 13 2 14 2 15 3 16 3
다음 결과를 계산해야합니다.
res_df = pd.DataFrame({
"starts": [0, 3, 7, 11, 13, 15],
"ends": [3, 7, 11, 13, 15, 17]
})
print(res_df)
starts ends 0 0 3 1 3 7 2 7 11 3 11 13 4 13 15 5 15 17
값이 중복되지 않은 경우 모든 중복 항목을 제로화하고 groupby의 그룹 길이를 유지 한 다음 cumsum과 같은 작업을 수행 할 수 있습니다.
그러나 중복이 있으므로 순서를 유지해야합니다.
팬더에서 이것을 수행하는 방법이 있습니까?
후속 조치 로 계산 비용이 더 적게 드는 경우 df [ "a"] == 3에 대해서만 계산 starts
하고 싶습니다 ends
.
이것을 시도해 봅시다 :
blocks = df['a'].diff().ne(0).cumsum()
# depending on your mask
out = (df[some_mask]
.index.to_frame()
.groupby(blocks)[0]
.agg(['min','max'])
)
out['max'] += 1
산출:
min max
a
1 0 3
2 3 7
3 7 11
4 11 13
5 13 15
6 15 17
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다