我有一個包含一些虛擬變數的資料框,我想查看 df 值為 1 的列在同一行中該值右側的值為 0。這是一個資料框和將回傳我想要的行的列的示例。您可以看到,我希望生成索引為 #1、2 和 4 的行,因為 0 出現在 1 之后。它是記錄的大資料框,因此對日期進行硬編碼會太麻煩:
test_df = pd.DataFrame({'2018-02': [0, 0, 0, 0, 1], '2018-03': [0, 1, 1, 0, 0], '2018-04': [1, 1, 1, 1, 0], '2018-05': [1, 0, 0, 1, 0], '2018-06': [1, 1, 1, 1, 0]})
result_df = pd.DataFrame({'2018-02': [0, 0, 1], '2018-03': [1, 1, 0], '2018-04': [1, 1, 0], '2018-05': [0, 0, 0], '2018-06': [1, 1, 0]})
嘗試的代碼:
pd.DataFrame({'2018-02': [0, 0, 0, 0, 1], '2018-03': [0, 1, 1, 0, 0], '2018-04': [1, 1, 1, 1, 0], '2018-05': [1, 0, 0, 1, 0], '2018-06': [1, 1, 1, 0, 0]})
test_df[[(test_df == 1) & (df_duration.shift(-1, axis=0) == 0)]].head()
uj5u.com熱心網友回復:
一種使用方式pandas.DataFrame.shift:
res = test_df[(test_df.eq(0) & test_df.shift(axis=1).eq(1)).any(1)]
輸出:
2018-02 2018-03 2018-04 2018-05 2018-06
1 0 1 1 0 1
2 0 1 1 0 1
4 1 0 0 0 0
它檢查單元格為 0 并在移位時變為 1(即串行視圖中的 (1, 0) 對)
uj5u.com熱心網友回復:
您可以每行取前一個差異。1 后跟 0 之前的差異為 1:
test_df[test_df.diff(-1, axis=1).eq(1).any(axis=1)]
輸出:
2018-02 2018-03 2018-04 2018-05 2018-06
1 0 1 1 0 1
2 0 1 1 0 1
4 1 0 0 0 0
uj5u.com熱心網友回復:
其他答案可能是最直接的,但這里有一種可能很有趣的不同方法:
如果每一行只包含 0 和 1,那么在 1 之后不出現 0 的唯一方法是有一堆連續的 0,然后是連續的 1。我們可以通過逐行差異來檢查這一點。因為[0,0,0,...,1,1,1]在發生這種變化的地方,差異應該是全 0 和一個 1,所以行差異的唯一值應該是[0,1]。對于除此之外的任何其他情況[0,0,0,...1,1,1],1 將不得不變回 0,這意味著此類行的唯一值將包括該值-1。
因此,此運算式將為您提供連續 0 后跟連續 1 的所有行: test_df.diff(axis=1).dropna(axis=1).apply(lambda x: np.array_equal(x.unique(), [0,1])
然后我們需要做的就是否定這個并使用 .loc 選擇這樣的索引:
import numpy as np
test_df.loc[~test_df.diff(axis=1).dropna(axis=1).apply(lambda x: np.array_equal(x.unique(), [0,1]), axis=1)]
輸出:
2018-02 2018-03 2018-04 2018-05 2018-06
1 0 1 1 0 1
2 0 1 1 0 1
4 1 0 0 0 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/344549.html
