说,我有以下数据框:
df0 = pd.DataFrame([[1,2],[3,4],[5,6]], columns=['X','Y'])
我想将每列的平均值和范围相乘,并为新构造的列分配描述性的列名称。我想到的输出是:
X | X_mean | X_range | Y | Y_mean | Y_range
1 | 3 | 4 | 2 | 8 | 8
3 | 9 | 12 | 4 | 16 | 16
5 | 15 | 20 | 6 | 24 | 24
我尝试使用.agg方法传递以下函数,但
def mean_range(data):
Xa = np.mean(data) * data
Xb = (max(data) - min(data)) * data
df1 = pd.DataFrame(np.array([data, Xa, Xb]).T, columns=['data','Xa','Xb'], index=range(len(data)))
return df1
df0.agg(mean_range)
df0
(i)我不知道如何将列名传递到.agg
(ii)它抛出ValueError: If using all scalar values, you must pass an index
。
我们非常感谢您的帮助。谢谢。
答案 0 :(得分:1)
IIUC,在放入agg
之前将其包装。您可以使用data.name
来获取系列的名称。
def mean_range(data):
Xa = np.mean(data) * data
Xb = (max(data) - min(data)) * data
n = data.name # Get the series' name
df1 = pd.DataFrame(np.array([data, Xa, Xb]).T, columns=[n, n+"_mean", n+"_range"], index=range(len(data)))
return df1
df2 = df0.agg([mean_range])
df2.columns = [i[-1] for i in df2.columns]
print(df2)
输出:
X X_mean X_range Y Y_mean Y_range
0 1.0 3.0 4.0 2.0 8.0 8.0
1 3.0 9.0 12.0 4.0 16.0 16.0
2 5.0 15.0 20.0 6.0 24.0 24.0
答案 1 :(得分:1)
如果我很好地理解了您的问题,可以执行操作(乘以列均值和范围),可以使用lambda函数使用apply
要创建X_mean:
df0['x_mean'] = df0.apply(lambda z: z['X'] * df0['X'].mean(), axis=1)
(Lambda函数会将df0 ['X']的元素乘以df0 ['X']的平均值)
我只是不太了解使用范围函数要获得的位置,但是一旦您了解了我使用的方法,就可以轻松地将其应用于任何其他计算。例如,您可以这样做:
def calculating_range(data, mean_data, max_data, min_data):
Xa = np.mean(data) * data
Xb = (max_data - min_data) * data
(... do your calculations in here)
r = Xa - Xb
return r
df0['Y_range'] = df0.apply(lambda z: calculating_range(z['Y'],
df0['Y'].mean(),
df0['Y'].max(),
df0['Y'].min(), axis=1)
请注意,参数“ DATA”是df0 ['Y']列中的值。您可以定义“ N”个参数以传递给“ calculating_range”函数。