在熊猫数据框的每一列上应用多种功能

时间:2020-09-09 12:41:46

标签: python pandas dataframe

说,我有以下数据框:

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

我们非常感谢您的帮助。谢谢。

2 个答案:

答案 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”函数。