如何计算 python 数据框中特定行的平均值?

How to calculate mean of specific rows in python dataframe?

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

TagName     DataType    TimeStamp           Sample_value Samples_quality
Utilities   Float      2019-01-01 13:00:00  1060805.75      3
Utilities   Float      2019-01-01 17:30:00  136.8110352     3
Utilities   Float      2019-01-01 17:45:00  136.7932892     3
Steam       Float      2019-01-01 14:01:00  1086446.875     3
Steam       Float      2019-01-01 14:00:00  1076446.875     3

RangeIndex: 11140487 entries, 0 to 11140486
Data columns (total 6 columns):
TagName              object
Samples_Value        object

这就是我所拥有的,我知道它真的很菜鸟,但我很难浏览行。

for i in range(0, len(df):
if((df.iloc[i]['DataType']!='Undefined')):
    print df.loc[df['Tagname'] == df.iloc[i]['TagName'], df.iloc[i]['Samples_Value']].mean()
  
   

听起来像每个组的groupby() functionality is what you want. You define the column where your groups are and then you can take the 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

这是您要找的吗?

您无需遍历行,只需获取符合条件的所有字段

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)

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

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

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 使它们恢复正常的列