【问题标题】:Determine value of columns on each row based on date offsets and column condition, and thus inputting values from corresponding offseted rows根据日期偏移量和列条件确定每一行的列值,从而从相应的偏移行输入值
【发布时间】:2022-10-16 01:04:08
【问题描述】:

我想添加一系列列,其值由当前年份的一组布尔列(在本例中为 y0、y1、y2、y3)中存在的日期偏移量确定。

考虑以下数据框

import pandas as pd
import numpy as np

# Raw Data
years = ["2000", "2001", "2002", "2003"]
num_combos = len(years)
products = ["A"] * num_combos
bools = [True, False, True, False]
bools1 = [False, True, False, np.nan]
bools2 = [True, False, np.nan, np.nan]
bools3 = [False, np.nan, np.nan, np.nan]
values = [100, 97, 80, np.nan]

cols = {"years": years,
        "products": products,
        "y0": bools,
        "y1": bools1,
        "y2": bools2, 
        "y3": bools3,
        "value": values}
df = pd.DataFrame(cols)
df[["y0", "y1", "y2", "y3"]] = df[["y0", "y1", "y2", "y3"]].astype(float)

考虑 2000 年

y0 为 1,因此 2000 年的值 (value_0) 为 100 y1 为 0,因此未来一年后 2000 年的值 (value_1) 为 NaN y2 为 1,因此 2000 年两年后的值(value_2)是 2002 年的值,即 80 等

这将产生以下数据框。

df["value_0"] = [100, np.nan, 80, np.nan]
df["value_1"] = [np.nan, 80, np.nan, np.nan]
df["value_2"] = [80, np.nan, np.nan, np.nan]
df["value_3"] = [np.nan, np.nan, np.nan, np.nan]

有没有使用 apply 或 np.where 确定这些列的巧妙方法? (或替代)

【问题讨论】:

    标签: python pandas dataframe numpy apply


    【解决方案1】:

    使用您提供的数据框df,这是一种方法:

    # Setup
    counter = range(df.shape[0])
    
    # Add new columns and rows
    temp_df = pd.DataFrame(
        data=[df["value"].shift(-i).T for i in counter],
    )
    temp_df.columns = [f"value_{i}" for i in counter]
    temp_df.index = [i for i in counter]
    df = pd.concat([df, temp_df], axis=1)
    
    # Update values according to "y0", "y1", ... columns
    for i in counter:
        df[f"value_{i}"] = df.apply(
            lambda x: x[f"value_{i}"] if x[f"y{i}"] else None, axis=1
        )
    
    print(df)
    # Output
      years products   y0   y1   y2   y3  value  value_0  value_1  value_2  
    0  2000        A  1.0  0.0  1.0  0.0  100.0    100.0      NaN     80.0   
    1  2001        A  0.0  1.0  0.0  NaN   97.0      NaN     80.0      NaN   
    2  2002        A  1.0  0.0  NaN  NaN   80.0     80.0      NaN      NaN   
    3  2003        A  0.0  NaN  NaN  NaN    NaN      NaN      NaN      NaN   
    
       value_3  
    0      NaN  
    1      NaN  
    2      NaN  
    3      NaN  
    

    【讨论】:

      猜你喜欢
      • 2011-08-04
      • 1970-01-01
      • 2015-02-06
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多