【问题标题】:How to calculate mean of specific rows in python dataframe?如何计算python数据框中特定行的平均值?
【发布时间】:2022-08-23 04:09:56
【问题描述】:

我有一个包含 11 000k 行的数据框。有多个列,但我只对其中 2 个感兴趣:TagName 和 Samples_Value。一个标签可以在行之间重复多次。我想计算每个标签的平均值并使用每个标签的平均值创建一个新的数据框。我真的不知道如何遍历行以及如何计算平均值。任何帮助将不胜感激。谢谢!

Name     DataType    TimeStamp           Value Quality
Food   Float       2019-01-01 13:00:00  105.75      122
Food    Float      2019-01-01 17:30:00  11.8110352  122
Food   Float       2019-01-01 17:45:00  12.7932892      122
Water       Float      2019-01-01 14:01:00  16446.875   122
Water       Float      2019-01-01 14:00:00  146.875     122

RangeIndex: 11140487 entries, 0 to 11140486
Data columns (total 6 columns):
Name              object
Value        object

这就是我所拥有的,我知道这真的很菜,但我很难穿过行。

for i in range(0, len(df):
if((df.iloc[i][\'DataType\']!=\'Undefined\')):
    print df.loc[df[\'Name\'] == df.iloc[i][\'Name\'], df.iloc[i][\'Value\']].mean()
  
   
  • 我可以回答我只有您发布了可复制的数据样本而不是图像,以便我可以测试我的代码。提示:使用groupbymean
  • @SergeBallesta 这样做了,希望对您有所帮助

标签: python pandas dataframe mean


【解决方案1】:

听起来groupby() 功能就是您想要的。您定义您的组所在的列,然后您可以获取每个组的mean()。文档中的一个示例:

df = pd.DataFrame({'A': [1, 1, 2, 1, 2],
                   'B': [np.nan, 2, 3, 4, 5],
                   'C': [1, 2, 1, 1, 2]}, columns=['A', 'B', 'C'])

df.groupby('A').mean()

输出:

     B         C
A
1  3.0  1.333333
2  4.0  1.500000

在你的情况下,它会是这样的:

df.groupby('TagName')['Samples_value'].mean()

编辑:因此,我将代码应用于您提供的输入数据帧,以下是输出:

TagName
Steam        1.081447e+06
Utilities    3.536931e+05
Name: Sample_value, dtype: float64

这是你想要的?

【讨论】:

  • 是的,感谢您的快速回复。但问题是 Samples_value 是对象类型,而不是数字。我试图将其转换为数字,我收到一个奇怪的错误(“(alueError:无法在位置 972918 解析字符串“Sheet break Start”)
  • 执行此代码时是否发生错误:df['Sample_value'] = df['Sample_value'].astype('float64') 还是执行groupby() 时发生错误? Samples_value 列是否还包含浮点数以外的任何内容?
  • 在执行您刚刚给我的行后,我收到此错误:ValueError:无法将字符串转换为浮点数。
  • 可能是您的列中有一些奇怪的值。使用df[~df['Sample_value'].map(np.isreal)],您可以过滤掉值不为浮点数的行。然后,您可以例如删除这些特定行。
【解决方案2】:

您无需逐行浏览,只需获取符合您条件的所有字段

d = {'col1': [1,2,1,2,1,2], 'col2': [3, 4,5,6,7,8]}
df = pd.DataFrame(data=d)

#iterate over all unique entries in col1
for entry in  df["col1"].unique():
    # get all the col2 values where col1 is the current iter of col1 entries
    meanofcurrententry=df[df["col1"]==entry]["col2"].mean()
    print(meanofcurrententry)

这不是一个完整的解决方案,但我认为它有助于更​​多地理解必要的逻辑。您仍然需要将它包装到您自己的数据框中,但是它希望有助于理解如何使用索引

【讨论】:

    【解决方案3】:

    您应该尽可能避免迭代数据框中的行,因为它非常低效......

    groupby 是当您想将相同的处理应用于各种团体由一列或多列中的值标识的行数。这里你想要的是(*):

    df.groupby('TagName')['Sample_value'].mean().reset_index()
    

    它按预期给出:

         TagName  Sample_value
    0      Steam  1.081447e+06
    1  Utilities  3.536931e+05
    

    魔术词的详细信息:

    • groupby:标识用于对行进行分组的列(相同的值)
    • ['Sample_values']:将 groupby 对象限制为感兴趣的列
    • mean():计算每组的平均值
    • reset_index():默认情况下,分组列进入索引,这对于均值操作很好。 reset_index 让它们恢复正常列

    【讨论】:

    • 感谢您的快速回复。有一个小问题,好像 Samples_Value 是对象类型。我试图将其转换为这样的数字: df['Samples_Value'] = pd.to_numeric(df['Samples_Value'], downcast='Float') 但我仍然收到错误(alueError: Unable to parse string "Sheet break开始”在位置 972918)
    • df['Samples_Value'] = pd.to_numeric(df['Samples_Value'],errors='ignore'),仍然不起作用。告诉我没有要聚合的数值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    相关资源
    最近更新 更多