![](/img/trans.png)
[英]Update values in pandas df column by adding fixed variable to preceding value
[英]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.