簡體   English   中英

Pandas:根據列中的當前值設置先前值(按組)

[英]Pandas: set preceding values conditional on current value in column (by group)

我有一個熊貓數據框,其中的值應該大於或等於前面的值。 在當前值低於先前值的情況下,必須將先前值設置為等於當前值。 下面的例子可以很好地解釋這一點:

data = {'group':['A', 'A', 'A', 'A', 'A', 'B', 'B', 
                'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C'], 
                 'value':[0, 1, 2, 3, 2, 0, 1, 2, 3, 1, 5, 0, 1, 0, 3, 2]} 
df = pd.DataFrame(data)
df

  group value
0   A     0
1   A     1
2   A     2
3   A     3
4   A     2
5   B     0
6   B     1
7   B     2
8   B     3
9   B     1
10  B     5
11  C     0
12  C     1
13  C     0
14  C     3
15  C     2

我正在尋找的結果是:

  group value
0   A     0
1   A     1
2   A     2
3   A     2
4   A     2
5   B     0
6   B     1
7   B     1
8   B     1
9   B     1
10  B     5
11  C     0
12  C     0
13  C     0
14  C     2
15  C     2

所以這是我的出發點! (特別感謝@jezrael 幫助我大大簡化了它!)

我將此基於Expanding Windows ,反過來,始終獲得每個組中元素的后綴(從最后一個元素開始,向第一個擴展)。

這個擴展窗口具有以下邏輯:對於索引i元素,您將獲得一個包含索引>=i組中所有元素的Series ,並且我需要在結果中為i返回一個新的單個值。
這個后綴對應的值是多少? 它的最低限度! 因為如果后面的元素較小,我們需要取其中最小的。

然后我們可以將此操作的結果分配給df['value']

嘗試這個:

df['value'] = (df.iloc[::-1]
                .groupby('group')['value']
                .expanding()
                .min()
                .reset_index(level=0, drop=True)
                .astype(int))
print (df)

輸出:

   group  value
0      A      0
1      A      1
2      A      2
3      A      2
4      A      2
5      B      0
6      B      1
7      B      1
8      B      1
9      B      1
10     B      5
11     C      0
12     C      0
13     C      0
14     C      2
15     C      2

我沒有得到你的輸出,但我相信你正在尋找類似的東西

df['fwd'] = df.value.shift(-1)
df['new'] = np.where(df['value'] > df['fwd'], df['fwd'], df['value'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM