Pandas库使用(四):DataFrame进阶操作

Pandas库使用(四):DataFrame进阶操作

1. 数据合并

在数据处理中,通常会遇到需要将多个DataFrame进行合并的情况。Pandas提供了concat()merge()join()三种方式来实现数据的合并。

(1)concat()

concat()函数用于沿着指定轴(axis=0axis=1)将两个或多个DataFrame合并。

import pandas as pd

# 创建两个DataFrame
df1 = pd.DataFrame({'Name': ['Alice', 'Bob'], 'Age': [25, 30]})
df2 = pd.DataFrame({'Name': ['Tom', 'Jerry'], 'Age': [22, 24]})

# 行合并(垂直合并)
result = pd.concat([df1, df2], axis=0)
print(result)

# 列合并(水平合并)
result = pd.concat([df1, df2], axis=1)
print(result)
(2)merge()

merge()函数类似于SQL的JOIN操作,支持多种连接方式(innerouterleftright)。

# 创建两个DataFrame
df1 = pd.DataFrame({'ID': [1, 2, 3], 'Name': ['Alice', 'Bob', 'Tom']})
df2 = pd.DataFrame({'ID': [2, 3, 4], 'Age': [30, 35, 40]})

# Inner Join(交集)
result = pd.merge(df1, df2, on='ID', how='inner')
print(result)

# Left Join(左连接)
result = pd.merge(df1, df2, on='ID', how='left')
print(result)
(3)join()

join()函数用于基于索引的合并。它是merge()的简化版本,适用于需要根据索引合并的场景。

df1 = pd.DataFrame({'Age': [25, 30]}, index=['Alice', 'Bob'])
df2 = pd.DataFrame({'Salary': [3000, 4000]}, index=['Alice', 'Tom'])

# 基于索引进行合并
result = df1.join(df2, how='inner')
print(result)
2. 数据分组与聚合

groupby()函数可以将数据根据某一列或多列进行分组,然后对每个分组进行聚合操作(如求和、计数、求均值等)。

# 创建DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Tom', 'Jerry'],
    'Gender': ['F', 'M', 'M', 'M'],
    'Score': [85, 90, 78, 88]
})

# 按性别分组并计算平均分
grouped = df.groupby('Gender')['Score'].mean()
print(grouped)

# 同时进行多个聚合操作
agg_result = df.groupby('Gender').agg({'Score': ['mean', 'max']})
print(agg_result)
3. 缺失值处理进阶

处理缺失值是数据分析中不可避免的一步,Pandas提供了灵活的方法来处理这些数据。

(1)填充缺失值

可以使用fillna()函数填充缺失值。除了使用常量填充外,还可以选择使用前一行或后一行的数据来填充。

# 创建包含缺失值的DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', None],
    'Score': [85, 90, None]
})

# 使用0填充缺失值
df_filled = df.fillna(0)

# 使用前一个有效值填充
df_filled_ffill = df.fillna(method='ffill')

print(df_filled)
print(df_filled_ffill)
(2)插值法

interpolate()函数可以使用线性插值等方法填充缺失值,这在处理时间序列数据时非常有用。

# 线性插值
df = pd.DataFrame({'Value': [1, None, 3, None, 5]})
df_interpolated = df.interpolate()
print(df_interpolated)
4. 数据变换

除了基本的加减乘除操作外,Pandas还提供了对数据进行变换的多种方法,如apply()applymap()map()等。

(1)apply()

apply()可以对DataFrameSeries中的每一行或每一列应用自定义函数。

# 创建DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Tom'],
    'Score': [85, 90, 78]
})

# 对每个分数加10分
df['New_Score'] = df['Score'].apply(lambda x: x + 10)
print(df)
(2)applymap()

applymap()函数用于对DataFrame中的每个元素应用自定义函数。

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

# 对DataFrame中的每个元素平方
df_squared = df.applymap(lambda x: x ** 2)
print(df_squared)
(3)map()

map()函数常用于对Series中的数据进行元素级别的映射转换。

# 创建Series
s = pd.Series([1, 2, 3, 4])

# 将每个数字映射为其平方
s_mapped = s.map(lambda x: x ** 2)
print(s_mapped)
5. 数据透视表与交叉表

pivot_table()crosstab()是进行多维数据分析的常用工具。

(1)pivot_table()

pivot_table()类似于Excel中的数据透视表,可以通过分组、聚合、重新排列数据来进行多维分析。

# 创建DataFrame
df = pd.DataFrame({
    'Name': ['Alice', 'Bob', 'Tom', 'Jerry'],
    'Gender': ['F', 'M', 'M', 'M'],
    'Score': [85, 90, 78, 88]
})

# 创建数据透视表
pivot = df.pivot_table(values='Score', index='Gender', aggfunc='mean')
print(pivot)
(2)crosstab()

crosstab()用于计算分组频率表,可以用于显示两个分类变量之间的关系。

# 创建交叉表
crosstab = pd.crosstab(df['Name'], df['Gender'])
print(crosstab)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值