【问题标题】:Multiple operations iterating over dataframe columns (apply function?)迭代数据框列的多个操作(应用函数?)
【发布时间】:2021-02-26 15:12:45
【问题描述】:

我有一个包含数千列的 pandas 数据框,我想对数据框的每一列执行以下操作:

  1. 检查i-th 和i-1-th 值是否在范围内(xy 之间);
  2. 如果满足#1,则查找该列的log(i/i-1) ** 2
  3. 如果不满足#1,则假设为0;
  4. 求每列的总和 #2。

这是一个只有一列的数据框:

d = {'col1': [10, 15, 23, 16, 5, 14, 11, 4]}
df = pd.DataFrame(data = d)
df

x = 10y = 20

这是我可以为这一列做的事情:

df["IsIn"] = "NA" 
for i in range(1, len(df.col1)):
    if (x < df.col1[i] < y) & (x < df.col1[i - 1] < y):
        df.IsIn[i] = 1
    else:
        df.IsIn[i] = 0

df["rets"] = np.log(df["col1"] / df["col1"].shift(1))
df["var"] = df["IsIn"] * df["rets"]**2
Total = df["var"].sum()
Total

理想情况下,每列都有一个Totals 的(1 x n-cols)数据框。我怎样才能最好地做到这一点?如果您能用详细的解释补充您的答案,我也将不胜感激。

【问题讨论】:

    标签: pandas function dataframe iteration apply


    【解决方案1】:

    是的,这是apply 工作的实例。您只需要将逻辑包装在一个函数中。另外,在消除第一个循环的条件下考虑betweenshift

    def func(s, x=10, y=20):
        '''
        compute the value given a series
        ''' 
    
        # mask where values are between x and y
        valid = s.between(x,y)
    
        # shift `valid` and double check
        valid = valid & valid.shift(fill_value=False)
    
        # squared log, mask with `valid`, and sum
        return (np.log(s/s.shift())**2 * valid).sum()
    
    # apply `func` on the columns
    df.apply(func, x=10, y=20)
    

    输出:

    col1    0.222561
    dtype: float64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      相关资源
      最近更新 更多