我有一个包含 11 000k 行的数据框。有多个列,但我只对其中的两列感兴趣:名称和值。一个名称可以在行中重复多次。我想计算每个名称的平均值,并使用每个名称的平均值创建一个新的数据框。我真的不知道如何遍历行以及如何计算平均值。任何帮助将不胜感激。谢谢!
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()
您无需浏览各行,只需选取符合您条件的所有字段即可
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()
功能正是您想要的。您定义组所在的列,然后可以获取每个组的 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
这是您要找的吗?
您应该尽可能避免迭代数据框中的行,因为它非常低效......
当您想要将相同的处理应用于由一列或多列中的值标识的各个行的“组”时,可以使用“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']
mean()
reset_index()
reset_index
使它们恢复正常列