【问题标题】:How to calculate mean in a particular subset and replace the value如何计算特定子集中的平均值并替换该值
【发布时间】:2020-06-25 09:40:06
【问题描述】:

csv 表格:

所以我有一个 csv 文件,其中包含不同的列,例如 nodeVolt、Temperature1、temperature2、temperature3、压力和光度。在温度列下,有多个单元格的值是错误的(即 220)。我想通过取前 10 个单元格的平均值并在那里替换它来替换该单元格中的该值。我希望通过在该特定列中查找所有值为 220 的单元格并用同一列中前 10 个值的平均值替换它来动态运行。

我能够在该特定问题中搜索包含 220 的单元格,但无法取平均值并替换它。

import pandas as pd 
import numpy as np 

data = pd.read_csv(r"108e.csv")
data = data.drop(['timeStamp','nodeRSSI','packetID', 'solarPanelVolt', 'solarPanelBattVolt',  
                  'solarPanelCurr','temperature2','nodeVolt','nodeAddress'], axis = 1) 

df =  pd.DataFrame(data)

df1 = df.loc[lambda df: df['temperature3'] == 220]

print(df1)

for i in df1:
    df1["temperature3"][i] == df["temperature3"][i-11:i-1, 'temperature3'].mean()

【问题讨论】:

    标签: python pandas dataframe csv numpy-ndarray


    【解决方案1】:

    给你:

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame(
        {
            "something": 3.37,
            "temperature3": [
                31.94,
                31.93,
                31.85,
                31.91,
                31.92,
                31.89,
                31.9,
                31.94,
                32.06,
                32.16,
                32.3,
                220,
                32.1,
                32.5,
                32.2,
                32.3,
            ],
        }
    )
    
    # replace all 220 values by NaN
    df["temperature3"] = df["temperature3"].replace({220: np.nan})
    
    # fill all NaNs with an shifted rolling average of the last 10 rows
    df["temperature3"] = df["temperature3"].fillna(
        df["temperature3"].rolling(10, min_periods=1).mean().shift(1)
    )
    

    结果:

        something   temperature3
    0   3.37    31.940
    1   3.37    31.930
    2   3.37    31.850
    3   3.37    31.910
    4   3.37    31.920
    5   3.37    31.890
    6   3.37    31.900
    7   3.37    31.940
    8   3.37    32.060
    9   3.37    32.160
    10  3.37    32.300
    11  3.37    31.986
    12  3.37    32.100
    13  3.37    32.500
    14  3.37    32.200
    15  3.37    32.300
    

    (请下次提供一些示例数据作为代码,而不是图像)

    【讨论】:

    • 非常感谢。但我有大约 300000 行的数据。一旦我实现了这个,我就可以改变大约 6000 行的值,超过这个值,它会显示 nan。我应该怎么做才能更改整个 csv 文件的值?
    • 我想不出为什么仅仅是大量的数据会让这个方法失败,在更大的数据集上应用这个方法是没有限制的。数据肯定有其他问题。
    • 也许数据有很多连续的 NaN/220 值?只有在每个滚动 10 值范围内至少有非 NaN 值时,间隙填充才有效。
    • 但是条件是以这样一种方式给出的,即只有当它在列中找到一个 nan 值时才应该进行滚动,对吗?但是,非常感谢您的回答。我能够使用 for 循环将 220 个值替换为平均值,并且效果很好。
    • 是的,min_periods=1 参数表示必须至少有一个值可用。但是,很高兴我的回答很有帮助。另外,请考虑将答案标记为已接受的答案。
    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 2019-01-27
    • 2019-11-26
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    相关资源
    最近更新 更多