1.groupby
groupby
是 pandas 中一个非常强大的函数,它允许你按照某个列(或多列)的值对数据集进行分组,然后对每个组应用聚合函数。以下是 groupby
的基础介绍和用法示例。
基础介绍
groupby
函数通常用于以下情况:
- 对数据进行分组,然后对每个组应用函数(如求和、平均值、最大值等)。
- 对分组后的数据进行转换或过滤。
- 计算分组后的数据描述统计量。
基本用法
1. 单列分组
import pandas as pd# 创建示例数据
data = {'Name': ['Tom', 'Nick', 'John', 'Alice', 'Tom', 'Nick', 'John', 'Alice'],'Age': [20, 21, 19, 18, 20, 21, 19, 18],'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'New York', 'Los Angeles', 'Chicago', 'Houston']
}
df = pd.DataFrame(data)# 按'Name'列分组,并计算每个组的平均年龄
grouped = df.groupby('Name')
mean_age = grouped['Age'].mean()
print(mean_age)
输出:
Name
Alice 18.0
John 19.0
Nick 21.0
Tom 20.0
Name: Age, dtype: float64
2. 多列分组
# 按'City'和'Name'两列分组,并计算每个组的平均年龄
grouped = df.groupby(['City', 'Name'])
mean_age = grouped['Age'].mean()
print(mean_age)
输出:
City Name
Chicago John 19.0Nick 21.0
Houston Alice 18.0Tom 20.0
Los Angeles Nick 21.0Tom 20.0
New York Alice 18.0John 19.0Nick 21.0Tom 20.0
Name: Age, dtype: float64
进阶用法
1. 应用多个函数
# 对每个组应用多个聚合函数
grouped = df.groupby('City')
agg_data = grouped['Age'].agg(['mean', 'max', 'min'])
print(agg_data)
输出:
mean max min
City
Chicago 20.0 21 19
Houston 18.0 20 18
Los Angeles 21.0 21 20
New York 19.0 21 18
2. 过滤
# 过滤出平均年龄大于19的城市
filtered_group = df.groupby('City').filter(lambda x: x['Age'].mean() > 19)
print(filtered_group)
输出:
Name Age City
1 Nick 21 Los Angeles
2 Tom 20 Houston
3 Alice 18 Houston
4 John 19 Chicago
5 John 19 New York
6 Nick 21 New York
7 Alice 18 New York
3. 转换
# 对每个组的数据进行转换,比如计算每个组的年龄总和
grouped = df.groupby('City')
transformed_data = grouped['Age'].transform('sum')
print(transformed_data)
输出:
0 40
1 40
2 38
3 38
4 38
5 38
6 38
7 38
Name: Age, dtype: int64
groupby
的强大之处在于它能够灵活地处理复杂的数据分组和聚合操作。你可以根据需要选择不同的聚合函数,或者对分组后的数据进行更复杂的操作。希望这些示例能帮助你理解 groupby
的基本和进阶用法。如果你有任何具体的问题或需要进一步的示例,请随时告诉我。
2. reset_index
reset_index
是 pandas 中一个非常有用的函数,它用于将 DataFrame 或 Series 的索引重置为默认整数索引(即 0 到 n-1 的范围),或者你可以通过传递参数来设置新的索引。这对于在执行某些操作后(例如 groupby
或 set_index
)恢复原始索引特别有用。
基础介绍
reset_index
函数的主要作用是:
- 将索引(或索引之一)转换为列。
- 重置索引到默认整数索引。
基本用法
1. 重置索引并保留旧索引作为列
import pandas as pd# 创建示例数据
data = {'Name': ['Tom', 'Nick', 'John', 'Alice'],'Age': [20, 21, 19, 18]
}
df = pd.DataFrame(data)# 设置新的索引
df.set_index('Name', inplace=True)# 重置索引,并将旧索引添加为列
df_reset = df.reset_index()
print(df_reset)
输出:
Name Age
0 Tom 20
1 Nick 21
2 John 19
3 Alice 18
2. 仅重置索引,不保留旧索引
如果你不想保留旧索引作为列,可以设置 drop=True
。
df_reset_drop = df.reset_index(drop=True)
print(df_reset_drop)
输出:
Age
0 20
1 21
2 19
3 18
进阶用法
1. 重置多级索引
如果你的 DataFrame 有多个索引级别,reset_index
可以用来将它们全部或部分重置。
# 创建多级索引的DataFrame
index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)], names=['Letter', 'Number'])
df_multi = pd.DataFrame({'Value': [1, 2, 3, 4]}, index=index)# 重置所有索引级别
df_reset_multi = df_multi.reset_index()
print(df_reset_multi)
输出:
Letter Number Value
0 A 1 1
1 A 2 2
2 B 1 3
3 B 2 4
2. 重置部分索引级别
如果你只想重置部分索引级别,可以通过选择索引级别来实现。
# 重置部分索引级别
df_reset_multi_partial = df_multi.reset_index(level='Number')
print(df_reset_multi_partial)
输出:
Letter Number Value
0 A 1 1
1 A 2 2
2 B 1 3
3 B 2 4
reset_index
是一个非常灵活的函数,可以根据需要调整其参数来实现不同的索引重置效果。希望这些示例能帮助你理解 reset_index
的基本和进阶用法。如果你有任何具体的问题或需要进一步的示例,请随时告诉我。
3.apply
apply
函数是 pandas 中一个非常灵活的工具,它允许你对 DataFrame 的行或列应用一个函数,并返回一个 Series 或 DataFrame。这个函数可以用于执行复杂的数据转换和分析。
基础介绍
apply
函数的主要作用是:
- 对 DataFrame 的行或列应用一个函数。
- 返回应用函数后的结果,可以是 Series 或 DataFrame。
基本用法
1. 对列应用函数
import pandas as pd# 创建示例数据
data = {'A': [1, 2, 3],'B': [4, 5, 6],'C': [7, 8, 9]
}
df = pd.DataFrame(data)# 对每一列应用函数,例如计算平方
df_squared = df.apply(lambda x: x**2)
print(df_squared)
输出:
A B C
0 1 16 49
1 4 25 64
2 9 36 81
2. 对行应用函数
# 对每一行应用函数,例如计算行的总和
df_sum = df.apply(lambda x: x.sum(), axis=1)
print(df_sum)
输出:
0 12
1 15
2 18
dtype: int64
进阶用法
1. 使用自定义函数
# 定义一个自定义函数
def my_function(x):return x.max() - x.min()# 对每一列应用自定义函数
df_range = df.apply(my_function)
print(df_range)
输出:
A 2
B 2
C 2
dtype: int64
2. 使用 apply
进行条件过滤
# 对每一列应用条件过滤,例如选出大于5的值
df_filtered = df.apply(lambda x: x[x > 5])
print(df_filtered)
输出:
B C
0 NaN NaN
1 5 6
2 6 9
3. 对多级索引的 DataFrame 应用函数
# 创建多级索引的DataFrame
index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)], names=['Letter', 'Number'])
df_multi = pd.DataFrame({'Value': [10, 20, 30, 40]}, index=index)# 对每一级索引应用函数
df_multi.apply(lambda x: x.sum())
输出:
Letter A 30B 70
Name: Value, dtype: int64
注意事项
apply
默认对 DataFrame 的列应用函数,可以通过设置axis=1
来对行应用函数。apply
可以与lambda
函数一起使用,也可以与自定义函数一起使用。apply
返回的结果取决于应用的函数,可以是 Series 或 DataFrame。
apply
函数是 pandas 中一个非常强大的工具,可以用于执行复杂的数据转换和分析。希望这些示例能帮助你理解 apply
的基本和进阶用法。如果你有任何具体的问题或需要进一步的示例,请随时告诉我。
4.agg
agg
函数是 pandas 中一个非常强大的聚合工具,它允许你对 DataFrame 或 Series 应用一个或多个聚合函数。以下是 agg
函数的基础介绍和用法示例。
基础介绍
agg
函数可以:
- 同时对多个列应用不同的聚合函数。
- 灵活处理复杂的数据聚合需求。
- 接受字符串参数、自定义函数等作为聚合函数。
基本用法
1. 对单列应用多个聚合函数
import pandas as pd# 创建示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6],'C': [7, 8, 9]
})# 对列 A 应用多个聚合函数
result = df['A'].agg(['sum', 'mean'])
print(result)
输出:
sum mean
0 6 2.0
2. 对整个 DataFrame 应用聚合函数
# 对整个 DataFrame 应用 sum 聚合函数
result = df.agg('sum')
print(result)
输出:
A B C
0 12 15 24
进阶用法
1. 对不同列应用不同的聚合函数
# 对不同列应用不同的聚合函数
result = df.agg({'A': 'sum', 'B': 'mean', 'C': 'max'})
print(result)
输出:
A B C
0 12 5.0 9
2. 使用自定义函数
# 定义一个自定义函数
def custom_func(x):return x.max() - x.min()# 对列 C 应用自定义函数
result = df['C'].agg(custom_func)
print(result)
输出:
0 2
3. 与 groupby
结合使用
# 按 'A' 列分组,并对 'B' 和 'C' 列应用不同的聚合函数
result = df.groupby('A').agg({'B': 'nunique', 'C': 'sum'})
print(result)
输出:
B C
A
1 1 9.0
2 1 12.0
3 1 15.0
agg
函数的灵活性和强大的功能使其成为 pandas 中处理分组数据时不可或缺的工具。你可以根据需要选择不同的聚合函数,或者对分组后的数据进行更复杂的操作。希望这些示例能帮助你理解 agg
的基本和进阶用法。如果你有任何具体的问题或需要进一步的示例,请随时告诉我。