如何计算 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
使它们恢复正常的列
我有一个包含 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
使它们恢复正常的列