我有一個包含一些負值和正值的資料框
我使用以下代碼來獲取行值的 pct_change
df_gp1 = df_gp1.pct_change(periods=4, axis=1) * 100
在這里我想分配一些特定的數字,具體取決于值如何從負變為正,反之亦然
例如,如果值從正變為負,則回傳 -100
負轉正,回傳 100
負到負,回傳-100,
正轉正,普通 pct_change
例如,我當前的資料框可能如下所示
| 資料 | D-4 | D-3 | D-2 | D-1 | D-0 |
|---|---|---|---|---|---|
| 一種 | -20 | -15 | -13 | -10 | -5 |
| 乙 | -30 | -15 | -10 | 10 | 25 |
| C | 40 | 25 | 30 | 41 | 30 |
| D | 25 | 25 | 10 | 15 | -10 |
我想要一個新的輸出(資料框),它給我以下回報
| 資料 | D-0 |
|---|---|
| 一種 | -100 |
| 乙 | 100 |
| C | -25 |
| D | -100 |
如您所見,第4期必須提供pct_change(即D-0 / D-4),但如果它保持負數,則從正變為負回傳-100,如果從負變為正則仍然回傳-100 , 回傳 100,如果是從正值變為另一個正值,則應用 pct_chg
我的原始資料框有 4000 行和 300 列大。因此我想要的輸出將有 4000 行和 296 列(因為它消除了資料 D-4、D-3、D-2、D-1
我嘗試制作條件串列和選擇串列,并使用 np.select 方法,但我只是不知道如何將它應用于整個資料框并創建回傳百分比變化的新資料框。
任何幫助都深表感謝。
uj5u.com熱心網友回復:
采用:
#convert column DATA to index if necessary
df = df.set_index('DATA')
#compare for less like 0
m1 = df.lt(0)
#comapre shifted 4 columns less like 0
m2 = df.shift(4, axis=1).lt(0)
#pass to np.select
arr = np.select([m1, ~m1 & m2, ~m1 & ~m2],
[-100, 100, df.pct_change(periods=4, axis=1) * 100])
#create DataFrame, remove first 4 columns
df = pd.DataFrame(arr, index=df.index, columns=df.columns).iloc[:, 4:].reset_index()
print (df)
DATA D-0
0 A -100.0
1 B 100.0
2 C -25.0
3 D -100.0
uj5u.com熱心網友回復:
鑒于:
D-4 D-3 D-2 D-1 D-0
DATA
A -20 -15 -13 -10 -5
B -30 -15 -10 10 25
C 40 25 30 41 30
D 25 25 10 15 -10
正在做:
def stuff(row):
if row['D-0'] < 0:
return -100
elif row['D-4'] < 0:
return 100
else:
return (row.pct_change(periods=4) * 100)['D-0']
print(df.apply(stuff, axis=1))
輸出:
A -100.0
B 100.0
C -25.0
D -100.0
dtype: float64
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/471416.html
