如何使用Pandas计算逗号分隔列的平均值?

5

让我们考虑以下CSV文件test.csv:

"x","y","A","B"
8000000000,"0,1","0.113948,0.113689",0.114042
8000000000,"0,1","0.114063,0.113823",0.114175
8000000000,"0,1","0.114405,0.114366",0.114524
8000000000,"0,1,2,3","0.167543,0.172369,0.419197,0.427285",0.427576
8000000000,"0,1,2,3","0.167784,0.172145,0.418624,0.426492",0.428736
8000000000,"0,1,2,3","0.168121,0.172729,0.419768,0.427467",0.428578

我的目标是根据列 "x""y" 将行分组,并计算列 "A""B" 的算术平均值。

我的第一种方法是在 Pandas 中使用 groupby()mean() 的组合:

import pandas

if __name__ == "__main__":
    data = pandas.read_csv("test.csv", header=0)
    data = data.groupby(["x", "y"], as_index=False).mean()
    print(data)

运行此脚本将产生以下输出:
            x        y         B
0  8000000000      0,1  0.114247
1  8000000000  0,1,2,3  0.428297

正如我们所看到的,实现单值列"B"的目标是直接的。然而,列"A"被省略了。相反,我想要列"A"中包含一个字符串,其中包含每个逗号分隔值的算术平均值。期望的输出应该像这样:

            x        y                                    A         B
0  8000000000      0,1                    0.114139,0.113959  0.114247
1  8000000000  0,1,2,3  0.167816,0.172414,0.419196,0.427081  0.428297

有人知道如何做到这一点吗?

1个回答

4
你可以创建一个自定义聚合函数,将这些字符串解析为列表,按列找到平均值,并将其格式化为字符串返回:
def string_mean(rows):
    data_list = []
    for row in rows:
        data_list.append([float(item) for item in row.split(",")])
    data = np.array(data_list)
    return ",".join([f"{item:.6f}" for item in data.mean(axis=0)])
    
df.groupby(["x", "y"], as_index=False).agg({"A": string_mean, "B": "mean"})

这将返回

            x        y                                    A         B
0  8000000000      0,1                    0.114139,0.113959  0.114247
1  8000000000  0,1,2,3  0.167816,0.172414,0.419196,0.427081  0.428297

请注意,如果A中的字符串在一个组中的列数不同,则会出现错误。
顺便说一下,您可能可以大大简化我的上述函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接