【问题标题】:Get average of columns in pandas based on particular rows根据特定行获取 pandas 中列的平均值
【发布时间】:2020-09-26 11:00:52
【问题描述】:

我有一个数据存储一天、一个月、三个月和一年内股票价值的百分比变化。

ID     daychange   monthchange   trimonthchange  yearchange
UNITY   0.001666     0.398450        0.411581    0.689139
SSOM  -0.033359     0.040816        1.174840    3.047619
PNSC  -0.004953    -0.053006        0.158677    0.224932
PICT  -0.002027    -0.069696        0.041143    0.310791
PIBTL  -0.014848     0.129362        0.459846    0.287100

我想得到:

  1. 基于 ID 名称的 4 个时间段中每个时间段的平均值。例如,要对“UNITY”“SSOM”“PNSC”进行分组,并计算每个时间段的平均值(即组的平均日变化、组的平均月变化等)。
  2. 将平均数据放入单独的 csv 文件中,其中包含新的单行(而不是“UNITY”“SSOM”“PNSC”)以及该组的每个时间段的平均值。

我已经尝试过df.mean(axis = 1),但这并没有成功。

任何帮助将不胜感激!谢谢

【问题讨论】:

    标签: python pandas dataframe average


    【解决方案1】:

    使用loc 按标签(ID 列)访问一组行,然后使用axis=0 计算每个时间段列的平均值。使用组名创建一个Series 并将先前的结果附加到它(这样组名将成为dataframe 中的第一列)。将Series 放在一个列表中,然后当对组的迭代完成后,转换为dataframe。要将结果放在单独的 csv 文件中,请使用 to_csv

    import pandas as pd
    
    GROUPS = [
        ["UNITY", "SSOM", "PNSC"],
        ["SSOM", "PICT", "PIBTL"],
        ["SSOM", "PNSC", "PIBTL"],
    ]
    
    df = pd.read_csv("sample.csv", sep="\s+")
    df = df.set_index("ID")
    
    data = []
    for g in GROUPS:
        group_mean = df.loc[g].mean(axis=0)
        serie = pd.Series({"groupName":"-".join(g)}).append(group_mean)
        data.append(serie)
    
    data = pd.DataFrame(data)
    print(data)
    data.to_csv("output.csv", index=False)
    

    数据的输出

             groupName  daychange  monthchange  trimonthchange  yearchange
    0  UNITY-SSOM-PNSC  -0.012215     0.128753        0.581699    1.320563
    1  SSOM-PICT-PIBTL  -0.016745     0.033494        0.558610    1.215170
    2  SSOM-PNSC-PIBTL  -0.017720     0.039057        0.597788    1.186550
    

    【讨论】:

    • 感谢您的回答!知道为什么它会引发 KeyError(f"None of {missing} are in the columns") KeyError: "None of ['ID'] are in the columns"
    • 我已将您在问题中发布的数据框复制到sample.csv,这就是我使用sep='\s+' 的原因。如果您的 CSV 文件具有默认分隔符 (,),您可以删除 sep 参数并且应该可以工作。此外,您始终可以print(df.head()) 确保数据框具有预期的结构。
    • 谢谢你们!!有用。最后,出于我的好奇心,如果我想将组名更改为更简洁和自定义的名称,您能否提出一些建议。
    • 在有限的上下文中给出相关建议是一项挑战,但直接的改进是使用key 将列表(例如groupDict ={'G1': ['UNITY', 'SSOM', 'PNSC'], 'G2': ['SSOM', 'PICT', 'PIBTL']})从list of lists 更改为dictionary组名。
    【解决方案2】:

    您可能需要链接filtermean 函数调用。由于您首先要选择一组要保留的行,因此您需要过滤掉那些您不想保留的行。然后,使用新数据集,您希望执行列平均。

    df.filter(lambda row: row.ID in ["UNITY", "SSOM", "PNSC"]).mean(axis = 1)
    

    请注意,我没有测试过上面的代码,并且不保证它会按原样工作

    【讨论】:

    • 它不会:/ return self.reindex(**{name: [r for r in items if r in labels]}) TypeError: 'function' object is not iterable
    猜你喜欢
    • 2018-10-02
    • 2013-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多