![](/img/trans.png)
[英]Delete a row from a Pandas df if the previous row is equal to some value
[英]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.