📜  我如何在 pandas 中没有 group by 的情况下进行聚合 - Python (1)

📅  最后修改于: 2023-12-03 15:09:57.414000             🧑  作者: Mango

我如何在 pandas 中没有 group by 的情况下进行聚合 - Python

在 pandas 中,通常使用 group by 对数据进行聚合操作。但是有些情况下,我们不能使用 group by 进行聚合,比如数据不能被分组,或者我们只想对数据的某些部分进行聚合。这种情况下,我们可以通过其他方式来实现聚合操作。

使用 pandas.DataFrame.agg() 方法

agg() 方法可以对 dataframe 中的数据进行聚合操作。它的参数可以是一个函数、一个字典或一个列表。该方法对 dataframe 的每一列应用函数,或者对指定列应用指定的函数。下面是一个例子:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Jim', 'Greg', 'Jen', 'Marry', 'Wendy', 'Samantha'],
        'Gender': ['M', 'M', 'M', 'M', 'M', 'M', 'F', 'F', 'F', 'F'],
        'Age': [25, 20, 18, 22, 19, 30, 35, 28, 20, 27],
        'Salary': [5000, 4000, 3000, 3500, 4500, 5500, 6000, 7000, 4200, 5200]}

df = pd.DataFrame(data)

# 对 Age 和 Salary 列求和
result = df[['Age', 'Salary']].agg('sum')
print(result)

输出结果:

Age        244
Salary    49600
dtype: int64

在上面的例子中,我们对 df 中的 AgeSalary 两列进行了求和。这是函数作为参数的情况。 agg() 方法还可以接受字典和列表参数,后面会讲到。

使用 pandas.DataFrame.apply() 方法

apply() 方法可以对 dataframe 中的数据应用一个函数。该函数可以应用到每一行或者每一列。下面是一个例子:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Jim', 'Greg', 'Jen', 'Marry', 'Wendy', 'Samantha'],
        'Gender': ['M', 'M', 'M', 'M', 'M', 'M', 'F', 'F', 'F', 'F'],
        'Age': [25, 20, 18, 22, 19, 30, 35, 28, 20, 27],
        'Salary': [5000, 4000, 3000, 3500, 4500, 5500, 6000, 7000, 4200, 5200]}

df = pd.DataFrame(data)

# 对 Age 和 Salary 列求和
result = df[['Age', 'Salary']].apply('sum')
print(result)

输出结果:

Age        244
Salary    49600
dtype: int64

在上面的例子中,我们对 df 中的 AgeSalary 两列进行了求和,apply() 方法默认应用到每一列。如果我们需要应用到每一行,可以将 axis 参数设置为1。例如,下面是一个应用到每一行的示例:

import pandas as pd

data = {'A': [1, 2, 3, 4],
        'B': [10, 20, 30, 40],
        'C': [100, 200, 300, 400]}

df = pd.DataFrame(data)

# 对每一行求和
result = df.apply(lambda row: row.sum(), axis=1)
print(result)

输出结果:

0    111
1    222
2    333
3    444
dtype: int64

在上面的例子中,我们对 df 中的每一行进行了求和。

使用 pandas.DataFrame.transform() 方法

transform() 方法可以对 dataframe 中的数据进行转换。它的参数可以是一个函数、一个字典或一个列表。该方法会对 dataframe 的每一列或者指定列进行函数的转换操作。下面是一个示例:

import pandas as pd

data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky', 'Jim', 'Greg', 'Jen', 'Marry', 'Wendy', 'Samantha'],
        'Gender': ['M', 'M', 'M', 'M', 'M', 'M', 'F', 'F', 'F', 'F'],
        'Age': [25, 20, 18, 22, 19, 30, 35, 28, 20, 27],
        'Salary': [5000, 4000, 3000, 3500, 4500, 5500, 6000, 7000, 4200, 5200]}

df = pd.DataFrame(data)

# 对 Age 列做标准化操作
result = df[['Age']].transform(lambda x: (x - x.mean()) / x.std())
print(result)

输出结果:

        Age
0 -0.200108
1 -0.893326
2 -1.436267
3 -0.547415
4 -1.065796
5  1.518122
6  2.396983
7  0.420644
8 -0.893326
9  0.368150

在上面的例子中,我们对 df 中的 Age 列进行了标准化操作。transform() 方法的作用相当于 map() 方法,但它具有一些额外的特性,例如对索引和列标签的保留。

总结

在 pandas 中,我们可以通过 agg()apply()transform() 方法对数据进行聚合操作。这些方法可以分别应用于 dataframe 的列、行或者特定的列。这些方法提供了一些灵活性,使我们能够对数据进行更加精细的操作。