在 for 循环内的 pandas 数据框中创建新列并给它们不同的名称

Create new columns in pandas dataframe inside for loop and give them different names

我有 4 个数据帧 (pandas),它们的结构与这个相似:

index   day1    day2   day3   day4   day5 ....
0        1.23   5.41    0      0      2.31
1        2.31   7.15    0      0      1.32 
...

我想计算每一行的均值、标准差、峰度和偏度,并将其作为新列添加到另一个现有数据中 frame.Right 现在我使用 for 循环来执行此操作,更改按 for 循环的计数计数列并将该数字作为字符串添加到列名称中,因此我不会 运行 覆盖前一个 for 循环的结果。这看起来像这样:

phen_1=rain_calc.iloc[:,:20]
phen_2=rain_calc.iloc[:,20:55]
phen_3=rain_calc.iloc[:,55:70]
phen_4=rain_calc.iloc[:,70:80]
phen_5=rain_calc.iloc[:,70:110]

dfs_phens=[phen_1,phen_2,phen_3,phen_4,phen_5]

phen=1

for df in dfs_phens:
    
    
    mean_col='mean_'+str(phen)
    std_col='std_'+str(phen)
    skew_col='skew_'+str(phen)
    kurt_col='mean_'+str(phen)
    total_col='total_'+str(phen)
    
    original_df[mean_col] =df.mean(axis=1)
    original_df[std_col] =df.std(axis=1)
    original_df[skew_col] =df.skew(axis=1)
    original_df[kurt_col]=df.kurt(axis=1)
    original_df[total_col]=df.sum(axis=1)
    
    phen=phen+1

这有效并为我提供了我想要的输出 - 包含计算统计信息的新列。但是,我想知道是否有更智能、更美观的代码方式来这样做:)

所以我的目标是改进我的脚本 - 在 for 循环中提供新的列名称,而不是每次都创建字符串,就像我现在所做的那样。

你考虑过使用字典吗?

my_dict = {
    "mean" : df.mean(axis=1),
    "std"  : df.std(axis=1),
    }

for colname, data in my_dict.items():
    original_df[colname + "_" + str(phen)] = data

phen=phen+1

您可以尝试使用 pandas.DataFrame.aggregate 在数据帧上聚合这些函数。

dfs = []

for i, df in enumerate(dfs_phens):

    df_ = (df.agg(['mean', 'std', 'skew', 'kurt', 'sum'], axis='columns')
           .rename(columns=lambda col: f'{col}_{i+1}'))
    dfs.append(df_)

original_df = pd.concat(dfs, axis=1)