簡體   English   中英

從 pandas df 獲取上一行/特定列的值

[英]Get value of previous row / specific column from a pandas df

對於 dataframe 的每一 (x) 行,我需要獲取存儲在前一行 (x-1) 和特定目標列中的值。 目標列的 header 存儲在 x 行的列 (Target_col) 中。

               0     1     2  Target_col
Date                                    
2022-01-01  37.0  26.0   NaN           0
2022-01-02   NaN  41.0   0.0           1
2022-01-03   NaN  40.0  43.0           1
2022-01-04   NaN   NaN  23.0           2

例如,在最后一行中,我的 Target_value 是 43.0,它存儲在上一行的“2”列中。 這是預期的 output:

               0     1     2  Target_col  Target_value
Date                                                  
2022-01-01  37.0  26.0   NaN           0           NaN
2022-01-02   NaN  41.0   0.0           1          26.0
2022-01-03   NaN  40.0  43.0           1          41.0
2022-01-04   NaN   NaN  23.0           2          43.0

我能夠通過復制 df 得到我想要的:

df2 = df.shift(periods=1)
df['Target_value'] = df2.lookup(df.index, df['Target_col'])

但我想有一種更聰明的方法可以做到這一點。 此外,不推薦使用查找。 有任何想法嗎?

請注意,我重塑了我的問題和示例 df 以使一切更清楚,因此 itprorh66 的回答和我對他的回答的評論不再相關。

我會稍微不同地處理這個問題,如下所示:給定一個基本 dataframe 的形式:df:

    date         a       b      c
0   2022-01-01  12.0    11.0    NaN
1   2022-01-02  10.0    11.0    NaN
2   2022-01-03  NaN     10.0    10.0
3   2022-01-04  NaN     11.0    9.0
4   2022-01-05  NaN      NaN    12.0 

我將創建一個僅包含第一個有效數據的列,而不是定義包含第一個有效數據的列,如下所示:

# helper function to find first valid data
def findfirst(row, cols_list):
    # return the first non-Nan value found within row
    for c in cols_list:
        if not np.isnan(row[c]):
            return row[c]
    return np.nan

然后使用上面的幫助器,我添加了包含所需數據的列“First”,如下所示:

df['First'] = df.apply(lambda row: findfirst(row, ['a', 'b', 'c']), axis= 1)  

這將創建以下 dataframe:

    date          a       b      c      First
0   2022-01-01  12.0    11.0    NaN     12.0
1   2022-01-02  10.0    11.0    NaN     10.0
2   2022-01-03  NaN     10.0    10.0    10.0
3   2022-01-04  NaN     11.0    9.0     11.0
4   2022-01-05  NaN      NaN    12.0    12.0   

從上面你可以計算變化值如下:

df['Change'] = (df['First']/df['First'].shift())-1

產生:

**  date    a   b   c   First   Change
0   2022-01-01  12.0    11.0    NaN 12.0    NaN
1   2022-01-02  10.0    11.0    NaN 10.0    -0.166667
2   2022-01-03  NaN 10.0    10.0    10.0    0.000000
3   2022-01-04  NaN 11.0    9.0 11.0    0.100000
4   2022-01-05  NaN NaN 12.0    12.0    0.090909**

這有點令人費解,但這有效:

cols = df.columns[:-1]
target_values = df[cols].to_numpy()[np.arange(len(df)), temp.astype(int)][:-1]
target_values = np.insert(target_values, 0, 0, axis=0)
df['target_values'] = target_values.tolist()

有人有更好的解決方案嗎?

暫無
暫無

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

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