目录
Pandas是Python中非常强大的数据分析库。它提供了两个主要的数据结构:Series和DataFrame,用于高效地处理和分析数据。本文将详细介绍这两种数据结构,并提供丰富的代码示例,帮助你更好地理解和使用Pandas。
一、Pandas Series
a 10
b 20
c 30
d 40
dtype: int64
1. 概述
Series是一维的数据结构,类似于Python中的列表或一维数组,但具有更多的功能。每个Series都有一个数据值列表和一个相关的索引列表。
2. 创建 Series
(1)使用列表创建 Series
import pandas as pd
data = [10, 20, 30, 40]
series1 = pd.Series(data)
print(series1)
(2)使用字典创建 Series
data = {'a': 10, 'b': 20, 'c': 30}
series2 = pd.Series(data)
print(series2)
(3)使用标量值和索引创建 Series
data = 5
index = ['a', 'b', 'c', 'd']
series3 = pd.Series(data, index=index)
print(series3)
(4)使用 Numpy 数组创建 Series
import numpy as np
data = np.array([1, 2, 3, 4])
series4 = pd.Series(data)
print(series4)
3. Series 的基本操作
(1)访问元素(索引和切片)
print(series1[0]) # 输出:10
print(series2['b']) # 输出:20
print(series1[1:3]) # 输出:20, 30
(2)修改元素
series1[0] = 100
print(series1)
(3)条件筛选
print(series1[series1 > 20]) # 输出:30, 40
(4)数学运算
print(series1 + 5) # 输出:15, 25, 35, 45
4. Series 的方法与属性
(1)head()
和 tail()
print(series1.head(2)) # 输出前2个元素
print(series1.tail(2)) # 输出后2个元素
(2)describe()
print(series1.describe()) # 输出统计信息摘要
(3)value_counts()
print(series1.value_counts()) # 输出值的频率
(4)unique()
和 nunique()
print(series1.unique()) # 输出唯一值
print(series1.nunique()) # 输出唯一值的数量
(5)apply()
和 map()
# apply
print(series1.apply(lambda x: x * 2))
# map
print(series2.map({'a': 100, 'b': 200, 'c': 300}))
5. Series 与 Numpy 的结合
(1)使用 Numpy 函数处理 Series
print(np.sqrt(series1))
(2)Series 和 Numpy 数组的互操作
array = series1.values
print(array)
new_series = pd.Series(array)
print(new_series)
二、Pandas DataFrame
Name Age Salary
0 Alice 25 50000
1 Bob 30 60000
2 Charlie 35 70000
1. 概述
DataFrame是二维的数据结构,类似于电子表格或SQL表格。DataFrame包含有序的列,每列可以是不同的数据类型。
2. 创建 DataFrame
(1)使用字典创建 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie'],
'age': [25, 30, 35],
'salary': [50000, 60000, 70000]
}
df1 = pd.DataFrame(data)
print(df1)
(2)使用列表创建 DataFrame
data = [
['Alice', 25, 50000],
['Bob', 30, 60000],
['Charlie', 35, 70000]
]
columns = ['name', 'age', 'salary']
df2 = pd.DataFrame(data, columns=columns)
print(df2)
(3)使用 Numpy 数组创建 DataFrame
import numpy as np
data = np.array([[25, 50000], [30, 60000], [35, 70000]])
df3 = pd.DataFrame(data, columns=['age', 'salary'])
print(df3)
(4)使用其他 DataFrame 创建新的 DataFrame
df4 = df1[['name', 'age']]
print(df4)
3. DataFrame 的基本操作
(1)选择列
print(df1['name']) # 输出name列
print(df1[['name', 'age']]) # 输出name和age列
(2)选择行
print(df1.loc[0]) # 按标签选择,输出第一行
print(df1.iloc[0]) # 按位置选择,输出第一行
(3)选择特定的元素
print(df1.at[0, 'name']) # 输出第一行name列的值
print(df1.iat[0, 0]) # 输出第一行第一列的值
(4)添加和删除列
df1['new_col'] = [1, 2, 3]
print(df1)
df1.drop('new_col', axis=1, inplace=True)
print(df1)
(5)添加和删除行
df1.loc[3] = ['David', 40, 80000]
print(df1)
df1.drop(3, inplace=True)
print(df1)
4. DataFrame 的方法与属性
(1)head()
和 tail()
print(df1.head(2)) # 输出前2行
print(df1.tail(2)) # 输出后2行
(2)info()
print(df1.info()) # 输出DataFrame的基本信息
(3)describe()
print(df1.describe()) # 输出数值列的统计信息摘要
(4)T
(转置)
print(df1.T) # 转置
(5)sort_values()
和 sort_index()
print(df1.sort_values(by='age')) # 按age列排序
print(df1.sort_index()) # 按索引排序
(6)groupby()
grouped = df1.groupby('age')
print(grouped.mean()) # 输出每个年龄组的平均值
(7)pivot_table()
pivot = df1.pivot_table(values='salary', index='age', columns='name', aggfunc='mean')
print(pivot)
5. 数据清洗与处理
(1)缺失值处理
data = {'name': ['Alice', 'Bob', None], 'age': [25, 30, None]}
df5 = pd.DataFrame(data)
print(df5.isnull()) # 判断缺失值
print(df5.dropna()) # 删除缺失值
print(df5.fillna('Unknown')) # 填充缺失值
(2)数据类型转换
df5['age'] = df5['age'].astype('float')
print(df5.dtypes)
(3)重命名列
df5.rename(columns={'name': 'Name', 'age': 'Age'}, inplace=True)
print(df5)
(4)数据去重
data = {'name': ['Alice', 'Bob', 'Alice'], 'age': [25, 30, 25]}
df6 = pd.DataFrame(data)
print(df6.drop_duplicates())
6. 数据合并与连接
(1)concat()
data1 = {'name': ['Alice', 'Bob'], 'age': [25, 30]}
data2 = {'name': ['Charlie', 'David'], 'age': [35, 40]}
df7 = pd.DataFrame(data1)
df8 = pd.DataFrame(data2)
df_concat = pd.concat([df7, df8])
print(df_concat)
(2)merge()
和 join()
left = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
right = pd.DataFrame({'key': ['A', 'B', 'D'], 'value': [4, 5, 6]})
df_merge = pd.merge(left, right, on='key', how='inner')
print(df_merge)
三、Series 和 DataFrame 之间的转换
1. 从 DataFrame 提取 Series
name_series = df1['name']
print(name_series)
2. 将 Series 转换为 DataFrame
name_df = name_series.to_frame()
print(name_df)
3. 多个 Series 创建 DataFrame
age_series = pd.Series([25, 30, 35])
salary_series = pd.Series([50000, 60000, 70000])
df9 = pd.DataFrame({'age': age_series, 'salary': salary_series})
print(df9)
四、高级操作与技巧
1. 使用 MultiIndex(多重索引)
(1)创建 MultiIndex
arrays = [
['A', 'A', 'B', 'B'],
[1, 2, 1, 2]
]
multi_index = pd.MultiIndex.from_arrays(arrays, names=('letter', 'number'))
df10 = pd.DataFrame({'value': [10, 20, 30, 40]}, index=multi_index)
print(df10)
(2)访问 MultiIndex 数据
print(df10.loc['A'])
print(df10.loc[('A', 1)])
2. 数据透视表和交叉表
(1)pivot_table()
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 40],
'score': [85, 90, 95, 100]
}
df11 = pd.DataFrame(data)
pivot = df11.pivot_table(values='score', index='age', columns='name', aggfunc='mean')
print(pivot)
(2)crosstab()
data = {
'name': ['Alice', 'Bob', 'Alice', 'Bob'],
'score': [85, 90, 85, 90]
}
df12 = pd.DataFrame(data)
crosstab = pd.crosstab(df12['name'], df12['score'])
print(crosstab)
3. 时间序列数据
(1)时间索引
dates = pd.date_range('20230101', periods=6)
df13 = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['A', 'B', 'C', 'D'])
print(df13)
(2)处理时间数据的方法
print(df13.resample('D').mean()) # 按天重采样
五、实践与项目
1. 小型数据分析项目
(1)实际数据集的导入
url = 'https://people.sc.fsu.edu/~jburkardt/data/csv/hw_200.csv'
data = pd.read_csv(url)
print(data.head())
print(data.info())
(2)数据清洗与处理
# 删除缺失值
data.dropna(inplace=True)
# 转换数据类型
data[' "Height(Inches)"'] = data[' "Height(Inches)"'].astype('float')
(3)数据分析与可视化
import matplotlib.pyplot as plt
# 简单的描述统计
print(data.describe())
# 可视化
data[' "Height(Inches)"'].hist()
plt.show()
2. 综合案例
综合运用 Pandas 的各种功能进行数据处理和分析
# 合并数据
data1 = pd.DataFrame({'key': ['A', 'B', 'C'], 'value': [1, 2, 3]})
data2 = pd.DataFrame({'key': ['A', 'B', 'D'], 'value': [4, 5, 6]})
merged_data = pd.merge(data1, data2, on='key')
# 分组分析
grouped = merged_data.groupby('key')
print(grouped.mean())
# 透视表
pivot = pd.pivot_table(merged_data, values='value_x', index='key', columns='value_y', aggfunc='sum')
print(pivot)