从旧数据帧创建一个新数据帧,其中新数据帧包含旧数据帧中不同位置的列的行平均

Posted

技术标签:

【中文标题】从旧数据帧创建一个新数据帧,其中新数据帧包含旧数据帧中不同位置的列的行平均【英文标题】:Create a new dataframe from an old dataframe where the new dataframe contains row-wise avergae of columns at different locations in the old dataframe 【发布时间】:2021-08-03 22:54:04 【问题描述】:

我有一个名为“frame”的数据框,它有 16 列和 201 行。附上提供示例数据框的屏幕截图

enter image description here

请注意截图只是一个例子,原始数据框要大得多。

我想找到一种有效的方法(可能使用 for 循环或编写函数)来逐行平均数据框中的不同列。例如,要找到列 "rep" 和 "rep1" 和列 "repcycle" 和 "repcycle1" 的平均值(对于 set 和 setcycle) 并保存在只有平均列的新数据框。

我尝试过使用 iloc 编写代码

newdf= frame[['sample']].copy()
newdf['rep_avg']=frame.iloc[:, [1,5]].mean(axis=1)  #average row-wise
newdf['repcycle_avg']=frame.iloc[:, [2,6]].mean(axis=1)
newdf['set_avg']=frame.iloc[:, [3,7]].mean(axis=1)  #average row-wise  
newdf['setcycle_avg']=frame.iloc[:, [4,8]].mean(axis=1)
newdf.columns = ['S', 'Re', 'Rec', 'Se', 'Sec']

上面的代码完成了这项工作,但是记录每一列的位置很乏味。我宁愿自动化这个过程,因为其他数据文件也会重复这个过程。

【问题讨论】:

【参考方案1】:

基于您的愿望“我宁愿自动化这个过程,因为这对其他数据文件也重复” 我能想到的如下:

in [1]:  frame = pd.read_csv('your path')

结果如下所示,现在您可以看到要平均的是第 1,5 和 2,6 列等等。

out [1]:
    sample  rep   repcycle  set   setcycle  rep1    repcycle1   set1    setcycle1
0   66      40    4         5     3         40      4           5       3
1   78      20    5         6     3         20      5           6       3
2   90      50    6         9     4         50      6           9       4
3   45      70    7         3     2         70      7           7       2

所以,我们需要创建 2 个列表

in [2]: import numpy as np
        list_1 = np.arange(1,5,1).tolist()
in [3]: list_1
out[3]: [1,2,3,4]

这是你想要平均的前半部分[rep,repcycle,set,setcycle]

in [4]: list_2 = [x+4 for x in list_1]
in [5]: list_2
out[5]: [5,6,7,8]

这是你想要平均的下半年[rep1,repcycle1,set1,setcycle1]

in [6]: result = pd.concat([frame.iloc[:, [x,y].mean(axis=1) for x, y in zip(list_1,list_2)],axis=1)
in [7]: result.columns = ['Re', 'Rec', 'Se', 'Sec']

现在你得到了你想要的,它是自动化的,你需要做的就是改变上面的两个列表。

in [8]: result
out[8]:
    Re    Rec   Se   Sec
0   40.0  4.0   5.0  3.0
1   20.0  5.0   6.0  3.0
2   50.0  6.0   9.0  4.0
3   70.0  7.0   5.0  2.0

【讨论】:

以上是关于从旧数据帧创建一个新数据帧,其中新数据帧包含旧数据帧中不同位置的列的行平均的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas从现有数据帧的所有行组合创建新的数据帧

Pandas 创建时间序列并将其提取到新数据帧

如何返回一个新的数据框,其中数字代表其包含行的百分比[重复]

为数据帧分配新名称并将其另存为R中的单独对象

使用来自另一个数据帧的索引创建一个空数据帧

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列