我正在尝试遍历一个大型数据帧。根据几列确定唯一的组,根据组中有多少将平均值应用于另一列。在迭代大型数据集并在许多列上应用平均函数时,我当前的方法非常慢。有没有办法可以更有效地做到这一点?
这是问题的一个例子。我想找到 ['A', 'B', 'C'] 的独特组合。对于每个独特的组合,我想要列 ['D'] 的值/组中的行数。
编辑:生成的数据框应保留重复的组。但是编辑列“D”
import pandas as pd
import numpy as np
import datetime
def time_mean_rows():
# Generate some random data
A = np.random.randint(0, 5, 1000)
B = np.random.randint(0, 5, 1000)
C = np.random.randint(0, 5, 1000)
D = np.random.randint(0, 10, 1000)
# init dataframe
df = pd.DataFrame(data=[A, B, C, D]).T
df.columns = ['A', 'B', 'C', 'D']
tstart = datetime.datetime.now()
# Get unique combinations of A, B, C
unique_groups = df[['A', 'B', 'C']].drop_duplicates().reset_index()
# Iterate unique groups
normalised_solutions = []
for idx, row in unique_groups.iterrows():
# Subset dataframe to the unique group
sub_df = df[
(df['A'] == row['A']) &
(df['B'] == row['B']) &
(df['C'] == row['C'])
]
# If more than one solution, get mean of column D
num_solutions = len(sub_df)
if num_solutions > 1:
sub_df.loc[:, 'D'] = sub_df.loc[:,'D'].values.sum(axis=0) / num_solutions
normalised_solutions.append(sub_df)
# Concatenate results
res = pd.concat(normalised_solutions)
tend = datetime.datetime.now()
time_elapsed = (tstart - tend).seconds
print(time_elapsed)
我知道导致速度变慢的部分是当 num_solutions > 1 时。我怎样才能更有效地做到这一点
这是对 AT_asks 答案的补充,该答案仅给出了解决方案的第一部分。
一旦我们有了df.groupby(['A', 'B', 'C'])['D'].mean()
它,我们就可以使用它来更改'D'
原始数据帧副本中列的值,前提是我们使用共享相同索引的数据帧。那么全局解决方案是:
res = df.set_index(['A', 'B', 'C']).assign(
D=df.groupby(['A', 'B', 'C'])['D'].mean()).reset_index()
这将包含相同的行(即使res
来自 OP 问题的数据帧的顺序不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句