在 pandas 中,如何B根據 中的列創建新A列df,例如:
B=1如果A_(i 1)-A_(i) > 5或A_(i) <= 10B=0如果A_(i 1)-A_(i) <= 5
但是,第一個B_i值始終是一個
例子:
| 一種 | 乙 |
|---|---|
| 5 | 1(第一個 B_i) |
| 12 | 1 |
| 14 | 0 |
| 22 | 1 |
| 20 | 0 |
| 33 | 1 |
uj5u.com熱心網友回復:
diff與您的值進行比較并使用以下方法從布林值轉換為整數le:
N = 5
df['B'] = (~df['A'].diff().le(N)).astype(int)
注意。使用le(5)與反轉的比較可以使第一個值
輸出為 1:
A B
0 5 1
1 12 1
2 14 0
3 22 1
4 20 0
5 33 1
更新答案,只需將第二個條件與 OR ( |) 結合起來:
df['B'] = (~df['A'].diff().le(5)|df['A'].lt(10)).astype(int)
輸出:與上面提供的資料相同
uj5u.com熱心網友回復:
我對你的行數計算有點困惑,因為如果我們B_i根據條件進行計算,我們應該在最后一行而不是第一行有缺失值A_(i 1)-A_(i)(第一行應該有兩者,A_(i)最后A_(i 1)一行應該是缺失A_(i 1)值。
無論如何,根據您的示例,我假設我們計算B_(i 1).
import pandas as pd
df = pd.DataFrame(columns=["A"],data=[5,12,14,22,20,33])
df['shifted_A'] = df['A'].shift(1) #This row can be removed - it was added only show to how shift works on final dataframe
df['B']=''
df.loc[((df['A']-df['A'].shift(1))>5) (df['A'].shift(1)<=10), 'B']=1 #Update rows that fulfill one of conditions with 1
df.loc[(df['A']-df['A'].shift(1))<=5, 'B']=0 #Update rows that fulfill condition with 0
df.loc[df.index==0, 'B']=1 #Update first row in B column
print(df)
列印:
A shifted_A B
0 5 NaN 1
1 12 5.0 1
2 14 12.0 0
3 22 14.0 1
4 20 22.0 0
5 33 20.0 1
我不確定這是否是最快的方式,但我想它應該是一種更容易理解的方式。
小解釋:
df.loc[mask, columnname]=newvalue如果滿足條件(掩碼),則允許我們更新給定列中的值
(df['A']-df['A'].shift(1))>5) (df['A'].shift(1)<=10)
這里的每個條件都回傳 True 或 False。如果我們添加它們,如果其中任何一個為 True(即簡單的 OR),則結果為 True。如果我們需要并且我們可以將條件相乘
uj5u.com熱心網友回復:
使用Series.diff, 將第一個缺失值替換為1after compare 大于或等于Series.ge:
N = 5
df['B'] = (df.A.diff().fillna(N).ge(N) | df.A.lt(10)).astype(int)
print (df)
A B
0 5 1
1 12 1
2 14 0
3 22 1
4 20 0
5 33 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/441566.html
