python Pandas : Modify Dataframe with mask and create new Dataframe

标签 python pandas dataframe numpy

我有以下 df:

date   price   MA1  MA2 MA3
date0  price0  12   10  8
date1  price1  11   11 11 
date2  price2  12   21 14
date3  price3  13   12 15
date4  price4  14   14 14
date5  price5  15   17 14
date6  price6  19   16 15
date7  price7  15   12 13
date8  price8  11   10 13
date9  price9  21   12 13
date10 price10 13   11 14
date11 price11 14   14 14
date12 price12 16   16 16
date13 price13 34   32 23
date14 price14 12   12 12

我使用以下掩码过滤我的 df:

df =(data
    .assign(same=lambda x: (x['MA1'] == x['MA2']) & (x['MA1'] == x['MA3']))
    .loc[lambda x: x.same == True]
    )

我得到:

date   price   MA1  MA2 MA3
date1  price1  11   11 11 
date4  price4  14   14 14
date11 price11 14   14 14
date12 price12 16   16 16
date14 price14 12   12 12

因此 MA1、MA2 和 M3 匹配的日期为 date1、date4、date11、date 12、date14。

我想创建一个与此格式匹配的 df

date   price  price_past price_fut      return_past                return_future            
date1  price1  price0    price2      (price1-price0)/price0     (price2-price1)/price1     
date4  price4  price3    price5      (price4-price3)/price3     (price5-price4)/price4      
date11 price11 price10   price12     (price11-price10)/price10  (price12-price11)/price11  
date12 price12 price11   price13     (price12-price11)/price11  (price13 -price12)/price12                
date14 price14 price13   price15     (price14-price13)/price13  (price15-price14)/price14   

感谢您的帮助

最佳答案

一个可能的解决方案(我感谢 @AdrienPacifico 建议使用 pandas.query,这非常简化):

# I made column price equal to column MA1 
# to have numbers to play with
df['price'] = df['MA1']

df['price_past'] = df['price'].shift()
df['price_fut'] = df['price'].shift(-1)
df['return_past'] = (df['price'] - df['price_past']) / df['price_past']
df['return_future'] = (df['price_fut'] - df['price']) / df['price']

df.query("MA1==MA2==MA3").drop(['MA1', 'MA2', 'MA3'], axis=1)

输出:

      date  price  price_past  price_fut  return_past  return_future
1    date1     11        12.0       12.0    -0.083333       0.090909
4    date4     14        13.0       15.0     0.076923       0.071429
11  date11     14        13.0       16.0     0.076923       0.142857
12  date12     16        14.0       34.0     0.142857       1.125000
14  date14     12        34.0        NaN    -0.647059            NaN

关于 python Pandas : Modify Dataframe with mask and create new Dataframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73875162/

相关文章:

django 中的 python 程序

使用另一个数据帧的行中的值替换一个数据帧的列中的所有值(按行名称列名称匹配),替换为字符

python - 根据字符串是否由特定字母组成来过滤数据框

python - 如何使用Python中另一列的值填充pandas数据框中的空值?

python - 在 Pandas 中加入键不相等的地方

python - 输入 [type=file] 返回空值

保存图像时 Python Pillow 编码器错误 -2

python - 如何按属性的属性对查询集进行排序? Django

python - 仅获取 Pandas 中的一组元素

python - Pandas groupby 查找真假百分比