在 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)
我有 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)