簡體   English   中英

根據條件從當前行和上一行中的值創建列表

[英]Create list from value in current row and previous row based on condition

我有一個 dataframe 有兩列'a'和'b',其中'b'是'a'的值和前一個值'a'之間的差異

df = pd.DataFrame({'a': [10, 60, 30, 80, 10]})
df['b'] = df['a']-df['a'].shift(1)

    a   b
0   10  NaN
1   60  50.0
2   30  -30.0
3   80  50.0
4   10  -70.0

我想創建一個新列“c”,其值作為“a”的先前值和“a”的當前值(例如,[60,30])的列表,僅在“b”列為負的情況下。 否則,它必須是當前值“a”本身的列表。

生成的 output 應該看起來像

    a   b       c
0   10  NaN     [10]
1   60  50.0    [60]
2   30  -30.0   [60, 30]
3   80  50.0    [80]
4   10  -70.0   [80, 10]

如果 numpy 數組中的b < 0使用列表推導創建列表,其中由Series.shift添加的DataFrame.assign移位輔助列s

arr = df.assign(s = df['a'].shift(fill_value=0))[['a','b','s']].to_numpy()
df['c'] = [[s,a] if b < 0 else [a] for  a,b,s in arr]
print (df)
    a     b             c
0  10   NaN        [10.0]
1  60  50.0        [60.0]
2  30 -30.0  [60.0, 30.0]
3  80  50.0        [80.0]
4  10 -70.0  [80.0, 10.0]  

或者與由列表壓縮創建的一個元素列表一起使用Series.mask

s = pd.Series([[x] for x in df['a']], index=df.index)
#alternative
s = df['a'].apply(lambda x: [x])

df['c'] = s.mask(df['b'].lt(0), s.shift() + s)
print (df)
    a     b         c
0  10   NaN      [10]
1  60  50.0      [60]
2  30 -30.0  [60, 30]
3  80  50.0      [80]
4  10 -70.0  [80, 10]

使用Series.to_numpy並通過添加 newaxis 來增加維度,然后使用 boolean 索引與Series.lt並分配新值:

df['c'] = df['a'].to_numpy()[:, None].tolist()
df.loc[df['b'].lt(0), 'c'] = df['c'].shift() + df['c']

結果:

   a     b         c
0  10   NaN      [10]
1  60  50.0      [60]
2  30 -30.0  [60, 30]
3  80  50.0      [80]
4  10 -70.0  [80, 10]

加載數據:

df = pd.DataFrame({'a': [10, 60, 30, 80, 10]})
df['b'] = df['a']-df['a'].shift(1)

創建一個臨時的 Numpy 矩陣:

npa = np.array([df['a'].shift(1), df['a']]).transpose()

將矩陣寫入新的 df 列“c”:

df['c'] = list(npa)

如果“b”列中的值大於 0 或 NAN,則將“a”中的值復制到“c”:

df.loc[(df['b'] > 0) | (df['b'].isnull() == True) , 'c'] = pd.Series([[x] for x in df['a']])

暫無
暫無

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

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