這是我的資料框的簡化版本:
d = {'col1': ['a1', 'a2', 'a3', 'b1', 'b2', 'b3', 'c1', 'c2', 'c3', 'd1', 'd2', 'd3'], 'col2': [1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, 1], 'col3': [-1, -1, 1, -1, -1, 1, 1, 1, 1, -1, 1, 1]}
df = pd.DataFrame(d)
df
col1 col2 col3
0 a1 1 -1
1 a2 1 -1
2 a3 1 1
3 b1 -1 -1
4 b2 -1 -1
5 b3 -1 1
6 c1 -1 1
7 c2 1 1
8 c3 1 1
9 d1 -1 -1
10 d2 1 -1
11 d3 1 1
我想能夠拉出來只有那些行,其中col3 == 1 在第一次 n之后行col2 == 1 的第一次,每個字母組。
因此,例如,如果我們正在尋找col2 變為 1 后一行col3變為 1 的時間(對于每個字母組),我們將得到
col1 col2 col3
0 d3 1 1
因為對于d組來說,col2 在 d2 時從 -1 變為 1,而 col3 在 d3 時從 -1 變為 1。而這在任何其他組中都沒有發生過。
如果我們想要在 col2 變為 1 后兩行col3 變為 1 的行(對于每個字母組),我們將得到
col1 col2 col3
0 a3 1 1
因為對于組, col2 在 a1 處以 1 開始,而 col3 在 a3 處從 -1 變為 1。
編輯:
這是我笨拙的做法……有人有更優雅的解決方案嗎?
df['newCol'] = (
(((df['col2'].shift(n 1).isnull() | (df['col2'].shift(n 1) == -1)) &
(df['col2'].shift(n 1).isnull() | (df['col2'].shift(n 1) == -1))) |
(df['col1'].shift(n 1).str[0] != df['col1'].str[0])) &
(df['col2'].shift(n) == 1) &
(df['col3'].shift(n) == -1) &
(df['col2'].shift(1) == 1) &
(df['col3'].shift(1) == -1) &
(df['col2'] == 1) &
(df['col3'] == 1) &
(df['col1'].shift(n).str[0] == df['col1'].str[0])) if n > 0 \
else \
((((df['col2'].shift(n 1).isnull() | (df['col2'].shift(n 1) == -1)) &
(df['col2'].shift(n 1).isnull() | (df['col2'].shift(n 1) == -1))) |
(df['col1'].shift(n 1).str[0] != df['col1'].str[0])) &
(df['col2'] == 1) &
(df['col3'] == 1))
uj5u.com熱心網友回復:
將我的最后一條評論放入答案中。創建一個滯后使用的新列n,然后只需過濾標準方式并獲取 的第一個值col1。
n = 2
df['newCol'] = df['col2'].shift(n)
df.loc[(df['col3'] == 1) & (df['newCol'] == 1), ['col1']].values[0]
您可以將其包裝到一個函式中并使所有內容都成為引數。
uj5u.com熱心網友回復:
嘗試這個:
n=2
cond = pd.concat([(df['col2'] == 1).groupby(df['col1'].str[0]).cumsum().shift(n),
(df['col3'] == 1).groupby(df['col1'].str[0]).cumsum()],
axis=1)\
.eq(1)\
.all(axis=1)
df[cond]
輸出:
col1 col2 col3
2 a3 1 1
或者更簡單地說,我認為:
cond1 = (df['col2'] == 1).groupby(df['col1'].str[0]).cumsum().shift(n) == 1
cond2 = (df['col3'] == 1).groupby(df['col1'].str[0]).cumsum() == 1
df[cond1 & cond2]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/325869.html
上一篇:有沒有辦法像這樣比較df中的列?
下一篇:與R只有一位數不同時的資料轉換
