python-pandas自学
1. 概述
Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,用于数据分析 。已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。pandas是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具,也是一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算),可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据,可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。它主要实现了数据分析的五个重要环节:加载数据、整理数据、操作数据、构建数据模型、分析数据
2. 安装
pip install pandas -i https://mirrors.huaweicloud.com/repository/pypi/simple
3. 内置数据结构
3.1 Series
带标签的一维数组,能够存储各种数据类型
3.1.1 创建Series
pandas.Series(data, index, dtype, copy)
# data:一组数据
# index:数据索引标签,默认从0开始
# dtype:数据类型,会自动判断
# copy:是否data进行拷贝,默认False
import pandas as pd
# 创建空对象
ser_1 = pd.Series()
print(ser_1)
# 列表创建
ser_2 = pd.Series([1,2,3,4,5])
print(ser_2)
# ndarray创建
ser_3 = pd.Series(data=np.array(['mc','jw','ly']))
print(ser_3)
# 字典创建
ser_4 = pd.Series(data={'name':'mc','gender':'female'})
print(ser_4)
# 标量创建
ser_5 = pd.Series(data=5,index=[1,2,3,4,5]) # 这里如果index省略的话,只会创建一行
print(ser_5)
3.1.2 访问Series
import pandas as pd
data = {'name': 'mc', 'gender': 'female'}
ser = pd.Series(data=data)
print(ser["name"])
print(ser[1])
3.1.3 常用属性
import pandas as pd
ser = pd.Series([1, 2, 3, 4, 5])
print("以列表的形式返回所有行索引标签:", ser.axes)
print("返回对象的数据类型:", ser.dtype)
print("返回一个布尔值,用于判断数据对象是否为空", ser.empty)
print("返回输入数据的维数:", ser.ndim)
print("返回输入数据的元素数量:", ser.size)
print("以 ndarray 的形式返回 Series 对象:", ser.values)
print("返回一个 RangeIndex 对象,用来描述索引的取值范围:", ser.index)
3.1.4 常用方法
1. head() 和 tail()
import pandas as pd
ser = pd.Series(['mc', 'jw', 'ly', 'lxy', 'zy', 'lb'])
print("------------前5行------------")
print(ser.head()) # 这里head里面可以传打印的行数,默认是5
print("------------后5行------------")
print(ser.tail())
2. isnull() 和 notnull()
import pandas as pd
ser = pd.Series(['mc', 'jw', 'ly', 'lxy', None])
print("-------------null值-------------")
print(ser.isnull())
print("-------------非null值-------------")
print(ser.notnull())
print("-------------打印-------------")
print(ser[ser.notnull()])
3.2 DataFrame
二维表格型数据结构,也是异构数据结构,每列数据类型可以不同,其每行每列可看作带标签的Series结构
3.2.1 创建DataFrame
pandas.DataFrame(data, index, columns, dtype, copy)
# data:一组数据
# index:行标签
# columns:列标签
# dtype:数据类型
# copy:复制数据data,默认为False
import pandas as pd
# 创建空对象
df_1 = pd.DataFrame()
print(df_1)
# 列表创建
df_2 = pd.DataFrame(data=['mc', 'jw', 'ly', 'lxy'],columns='name')
print(df_2)
# 列表嵌套列表创建
data = [['A',1],['B',2],['C',3]]
df_3 = pd.DataFrame(data,columns=['name','age'],index=['a','b','c'])
print(df_3)
# 列表嵌套字典创建
data = [{'name':'mc', 'age':26}, {'name':'jw', 'age':25, 'gender':'female'}]
df_4 = pd.DataFrame(data=data) # 若在此处指定列,会导致数据丢失
print(df_4)
# 字典创建
data = {'name':['mc', 'jw', 'ly'], 'age':[26, 25, 24]}
df_5 = pd.DataFrame(data=data)
print(df_5)
# Series创建
data = {1:pd.Series([1, 2, 3], index=['a', 'b', 'c']), 2:pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df_6 = pd.DataFrame(data=data)
print(df_6)
3.2.2 列索引操作
1. 选取数据
import pandas as pd
df = pd.DataFrame({'name':['A','B','C'],'age':[10,20,30],'id':[1,2,3]})
print(df['name'])
2, 添加数据
import pandas as pd
df = pd.DataFrame({'name':['A','B','C'],'age':[10,20,30]})
# 赋值添加
df['sex'] = ['male', 'female', 'male']
print(df)
# 通过assign函数添加
df = df.assign(id = [1, 2, 3])
# 通过insert(loc, column, value)方法
# loc:插入位置的列索引
# column:新列的名称
# value:要插入的值
df.insert(1, 'height', [170, 168, 165])
print(df)
3. 修改数据
import pandas as pd
import numpy as np
df = pd.DataFrame({'name':['A','B','C'],'age':[10,20,30]})
# 修改列值
df['age'] -= 5
print(df)
# 修改列名
df.columns = ['names', 'ages']
print(df)
# rename方法
df = df.rename(columns={'names':'name', 'ages':'age'})
print(df)
# 修改数据类型
df['age'] = df['age'].astype(np.float32)
print(df)
4. 删除数据
import pandas as np
# DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
# labels:删除的标签,若有index或columns则忽略
# axis:删除的方向,0/index表示行,1/columns表示列
# index:删除的行标签
# columns:删除的列标签
# level:删除的级别
# inplace:是否直接修改原DataFrame
# errors:如何处理不存在标签
df = pd.DataFrame()
df['F'] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
df['S'] = pd.Series([5, 6, 7, 8], index=['a', 'b', 'c', 'd'])
print(df)
df1 = df.drop(['F'],axis=1)
print(df1)
print(df)
df.drop(['F'], axis=1, inplace=True)
print(df)
3.3.3 行索引操作
1. loc获取数据
import pandas as pd
# DataFrame.loc[row_indexer, column_indexer]
# row_indexer:行标签
# column_indexer:列标签
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print(df.loc['a']) # 选择行标签为 'a' 的行
print(df.loc['a':'c']) # 选择行标签从 'a' 到 'c' 的行
print(df.loc['a', 'B']) # 选择行标签为 'a',列标签为 'B' 的元素
print(df.loc[['a', 'c'], ['A', 'C']]) # 选择行标签为 'a' 和 'c',列标签为 ‘A’ 和 ‘C’ 的数据
2. iloc获取数据
import pandas as np
# DataFrame.iloc[row_indexer, column_indexer]
# 参数同loc相同
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
print(df.iloc[0]) # 选择第 0 行的数据
print(df.iloc[0:2]) # 选择第 0 到 1 行的数据
print(df.iloc[0, 1]) # 选择第 0 行,第 1 列的元素
print(df.iloc[[0, 2], [0, 2]]) # 选择第 0 和 2 行,第 0 和 2 列的数据
3. 切片选取
import pandas as pd
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
result = df[0:2]
print(result)
4. 添加新行
import pandas as pd
data = {
'A': [1, 2, 3, 4],
'B': [5, 6, 7, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
# pandas 1.4.0后被弃用
# DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)
# loc方法
df.loc['e'] = [17, 18, 19, 20]
print(df)
# pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=False, copy=True)
# objs:要连接的DataFrame或Series对象
# axis:连接的轴,0/index表示行,1/columns表示列
# join:连接方式,outer(并集、默认),inner(交集)
# ignore_index:是否忽略原始索引,生成新索引
# 以下参数了解即可
# keys:创建层次化索引
# levels:层次化索引级别
# names:层次化索引名称
# verify_integrity:是否检测有重复索引
# sort:是否进行排序
# copy:是否复制数据
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
})
df2 = pd.DataFrame({
'A': [7, 8, 9],
'B': [10, 11, 12]
})
print(pd.concat([df1, df2], axis=0))
5. 删除行
import pandas as pd
data = {'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data)
df_del = df.drop('a')
print(df_del)
3.3.4 常用属性和方法
import pandas as pd
data = {"A": [1, 2, 3, 4], "B": [5, 6, 7, 8]}
df = pd.DataFrame(data=data, index=['a', 'b', 'c', 'd'])
print("行列转置后的数据\n", df.T)
print("行轴和列轴标签:", df.axes)
print("每列数据类型:", df.dtypes)
print("是否为空:", df.empty)
print("DataFrame的维度:", df.ndim)
print("DataFrame形状:", df.shape)
print("元素数量:", df.size)
print("元素值:", df.values)
print("前3行:\n", df.head(3))
print("后3行:\n", df.tail(3))
4. 常用函数
4.1 常用统计学函数
函数名称 | 描述说明 |
---|---|
count() | 统计某个非空值的数量 |
sum() | 求和 |
mean() | 求均值 |
median() | 求中位数 |
std() | 求标准差 |
min() | 求最小值 |
max() | 求最大值 |
abs() | 求绝对值 |
prod() | 求所有数值的乘积 |
import pandas as pd
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
print("----------------每列均值----------------")
print(df.mean())
print("---------------每列中位数---------------")
print(df.median())
# 这里和numpy的方差不同,pandas计算的是样本方差
print("----------------每列方差----------------")
print(df.var())
print("---------------每列标准差---------------")
print(df.std())
print("---------------每列最小值---------------")
print(df.min())
print("---------------每列最大值---------------")
print(df.max())
print("----------------每列总和----------------")
print(df.sum())
print("---------------每列非空数---------------")
print(df.count())
4.2 重置索引
4.2.1 reindex
DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=np.nan, limit=None, tolerance=None)
# labels:新的索引标签
# index:行索引
# columns:列索引
# axis:重新索引的轴,0/index为行,1/columns为列
# method:用于填充缺失值的方法,ffill:向前填充,bfill:向后填充
# copy:是否返回新的DataFrame或Series
# level:重新索引的级别
# fill_value:填充缺失值的值
# limit:连续填充的最大数量
# tolerance:重新索引的容差
import pandas as np
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
df_1 = df.reindex(['a', 'b', 'c', 'd'])
print(df_1)
df_2 = df.reindex(columns=['A', 'B', 'C', 'D'])
print(df_2)
df_3 = df.reindex(['a', 'b', 'c', 'd'], method='ffill')
print(df_3)
df_4 = df.reindex(['a', 'b', 'c', 'd'], fill_value=0)
print(df_4)
4.2.2 reindex_like
DataFrame.reindex_like(other, method=None, copy=True, limit=None, tolerance=None)
# other:对齐索引和列的参考对象
# method:填充缺失值的方法,ffill:向前填充,bfill:向后填充
# copy:是否返回新的DataFrame或Series
# limit:填充的最大数量
# tolerance:重新索引的容差
import pandas as pd
# 对齐行索引
df1 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=['a', 'b', 'c'])
df2 = pd.DataFrame({
'A': [7, 8, 9],
'B': [10, 11, 12]
}, index=['b', 'c', 'd'])
df_1 = df1.reindex_like(df2)
print(df_1)
# 对齐列索引
df3 = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6]
}, index=['a', 'b', 'c'])
df4 = pd.DataFrame({
'B': [7, 8, 9],
'C': [10, 11, 12]
}, index=['a', 'b', 'c'])
df_2 = df3.reindex_like(df4)
print(df_2)
4.3 遍历
# Series遍历
import pandas as pd
# for循环直接遍历
ser1 = pd.Series([1, 2, 3, 4, 5])
for item in ser1:
print(item, end=' ')
# items()
ser2 = pd.Series(['a', 'b', 'c'])
for index, value in ser2.items(():
print(f"Index: {index}, Value: {value}")
# index属性
for index iin ser2.index:
print(f"Index: {index}, Value: {ser2[index]}")
# values属性
for value in ser2.values:
print("Value: ", value)
# DataFrame遍历
import pandas as pd
# 直接访问,输出列标签
df = pd.DataFrame({
'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
})
for item in df:
print(item, end=' ')
# iterrows()
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['a', 'b', 'c'])
for index, row in df.iterrows():
print(index)
print(row)
# itertuples()
# 此方法速度和内存使用上更加高效
for row in df.itertuples(): # 忽略索引 for row in df.itertuples(index=False):
print(row)
for i in row:
print(i)
# items()
for col_name, col_data in df.items():
print(col_name)
print(col_data)
# 属性遍历
for index in df.index:
for col in df.columns:
print(f"Index: {index}, Column: {col}, Value: {df.loc[index, col]}")
4.4 排序
4.4.1 sort_index
DataFrame.sort_index(axis=0, ascending=True, inplace=False)
Series.sort_index(axis=0, ascending=True, inplace=False)# axis:排序的轴,0(按行),1(按列)
# ascending:是否为升序
# inplace:是否原地修改数据
import pandas as pd
data = {
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
}
df = pd.DataFrame(data, index=['b', 'c', 'a'])
df_1 = df.sort_index()
print(df_1)
df_2 = df.sort_index(axis=1, ascending=False)
print(df_2)
4.4.2 sort_values
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
# by:要排序的列
# axis:沿着哪个轴排序,0为行,1为列
# ascending:是否升序排列
# inplace:是否原地修改数据
# kind:排序算法
import pandas as pd df = pd.DataFrame({ 'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'Age': [25, 30, 25, 35, 30], 'Score': [85, 90, 80, 95, 88] }) df_1 = df.sort_values(by='Age') print(df_1) df_2 = df.sort_values(by=['Age', 'Score']) print(df_2) df_3 = df.sort_values(by='Age', ascending=False) print(df_3) df_4 = df.sort_values(by=['Age', 'Score'], ascending=[False, True]) print(df_4)
# na_position:缺失值的位置,first,last
4.5 去重
drop_duplicates(by=None, subset=None, keep='first', inplace=False)
Series.drop_duplicates(keep='first', inplace=False)# by:标记重复项的列名,未指定,则使用所有列
# subset:指定列的子集
# keep:如何保存重复项,first,last,False
# inplace:是否原地修改数据
import pandas as pd
data = {
'A': [1, 2, 2, 3],
'B': [4, 5, 5, 6],
'C': [7, 8, 8, 9]
}
df = pd.DataFrame(data)
df_1 = df.drop_duplicates()
print(df_1)
df_2 = df.drop_duplicates(keep='last')
print(df_unique)
4.6 分组
4.6.1 groupby
DataFrame.groupby(by, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)
# by:用于分组的列名
# axis:沿着哪个轴分组
# level:分组的MultiIndex的级别
# as_index:是否保留索引
# sort:是否进行排序
# group_keys:是否添加组键
# squeeze:是否返回一个元素
# observed:是否只考虑数据中出现的标签
import pandas as pd
data = {
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 40, 50, 60, 70, 80]
}
df = pd.DataFrame(data)
# 按A分组
grouped = df.groupby('A')
# 打印
for name, group in grouped:
print(f"Group: {name}")
print(group)
# 每组平均值
mean = grouped['C'].mean()
print(mean)
# 给每组添加平均值
# transform用于分组操作中每组内数据进行转换,并将结果合并到原数据内
# 常用的有mean(平均值),std(方差)
mean = grouped['C'].transform('mean')
df['C_mean'] = mean
print(df)
# 获取每组的信息
bar = grouped.get_group('bar')
print(bar)
4.6.2 filter
主要作用:按条件过滤数据,一般搭配groupby使用,具体方法如下:
import pandas as pd
data = {
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': [1, 2, 3, 4, 5, 6, 7, 8],
'D': [10, 20, 30, 40, 50, 60, 70, 80]
}
df = pd.DataFrame(data)
df_f = df.groupby('A').filter(lambda x: x['C'].mean() >= 4)
print(df_f)
4.7 合并
pandas.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
# left:左侧对象
# right:右侧对象
# how:合并方式,inner(默认,内连接),outer(外连接),left(左连接),right(右连接)
# on:连接的列名
# left_on和right_on:左侧/右侧连接列名
# left_index和right_index:是否使用索引作为连接键
# sort:是否进行排序
# suffixes:指定当列名冲突,左侧和右侧DataFrame后缀
# copy:是否返回一个新的DataFrame
# indicator:是否添加一个名为__merge的列,内容为如何合并的
# validate:验证是否符合特定的模式
import pandas as pd
left = pd.DataFrame({
'key':['k0', 'k1', 'k2', 'k3'],
'A':['A0', 'A1', 'A2', 'A3'],
'B':['B0', 'B1', 'B2', 'B3']
})
right = pd.DataFrame({
'key': ['K0', 'K1', 'K2', 'K4'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']
})
# 内连接
con_1 = pd.merge(left, right, on='key')
print(con_1)
# 左连接
con_2 = pd.merge(left, right, on='key', how='left')
print(con_2)
4.8 时间
4.8.1 datetime
'''
datetime模块并非pandas自带的模块,而是python自带的模块,所以仅介绍怎么使用
'''
from datetime import datetime
dt = datetime(2024, 5, 19, 16, 45, 30)
print(dt)
print(dt.date())
print(dt.time())
# 当前时间
print(datetime.now())
4.8.2 Timestamp
pandas.Timestamp(time, unit, tz)
# time:具体的时间或者时间戳
# unit:时间戳的单位
# tz:时区
import pandas as pd
ts_1 = pd.Timestamp(1739156800, unit='s', tz='Asia/Shanghai')
print(ts_1)
ts_2 = pd.Timestamp(1739156800100, unit='ms', tz='Asia/Chongqing')
print(ts_2)
4.8.3 日期解析
pandas.to_datetime(date_str)
# date_str:日期时间
import pandas as pd
date_obj = pd.to_datetime('2023-10-01')
print(date_obj)
4.8.4 date_range
pandas.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs)
# start:起始日期时间
# end:结束日期时间
# periods:生成的日期时间索引的数量,一般仅搭配start使用,不需要添加end
# freq:时间频率,‘D’(天),‘h’(小时),‘T’ / ‘min’(分钟),‘S’(秒)
# tz:时区
# normalize:是否归一化到午夜
# name:日期时间索引的名称
# closed:指定是否包含起止时间
import pandas as pd
dt = pd.date_range('2025-01-01', '2025-01-10', freq='D')
print(dt)
dt = pd.date_range(start='2025-02-10', freq='h', periods=5)
for date in dt:
print(date)
4.8.5 时间差
import pandas as pd
# 使用字符串建立
td_1 = pd.Timedelta('1 days 2 hours 30 minutes')
print(td_1)
# 使用参数建立
td_2 = pd.Timedelta(days=1, hours=2, minutes=30)
print(td_2)
# 使用整数和单位建立
td_3 = pd.Timedelta(5, unit='days')
print(td_3)
# 具体使用
td = pd.Timedelta(days=1, hours=2, minutes=3)
dt_1 = pd.Timestamp('2025-02-10') + td_1
print(dt_1)
dt_2 = datetime(2024, 5, 19, 16, 45, 30)
dt_2 += td_3
4.8.6 时间日期格式化
from datetime import datetime
date = datetime(2025, 2, 10, 17, 24, 30)
date_str = date.strftime("%Y-%m-%d %H:%M:%S")
print(date_str)
date_p = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(date_p)
'''
%y:两位数的年份
%Y:四位数的年份
%m:月份
%d:天数
%H:24小时制的小时数
%I:12小时制的小时数
%M:分钟数
%S:秒数
'''
4.9 随机抽样
DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
# n:抽取的行数
# frac:抽取的比例
# replace:是否放回抽样数据
# weights:权重值
# random_state:随机状态,None为不重复,1为可重复
# axis:哪个方向抽取,0为行,1为列
import pandas as pd
df = pd.DataFrame({
"company": ['百度', '阿里', '腾讯'],
"salary": [43000, 24000, 40000],
"age": [25, 35, 49]
})
# 随机选两行
print(df.sample(n=2, axis=0))
# 随机选一列
print(df.sample(n=1, axis=1))
# 选取一半
print(df.sample(axis=0, frac=0.5))
4.10 空值处理
4.10.1 检测空值
import pandas as pd
import numpy as np
data = {
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data)
# 检测空值
print(df.isnull())
# 检测非空值
print(df.notnull())
4.10.2 填充空值
import pandas as pd
import numpy as np
data = {
'A': [1, 2, np.nan, 4],
'B': [5, np.nan, np.nan, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data)
print(df.fillna(0)) # 这里面的参数可以是其他的,代表用来填充空值的值
4.10.3 删除空值
import pandas as pd
import numpy as np
data = {
'A': [1, 2, np.nan, 4]
'B': [5, np.nan, np.nan, 8]
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data)
print(df.dropna()) # 默认axis=0,代表删除有空值的行
print(df.dropna(axis=1)) # axis=1,代表删除有空值的列
5. 读取文件
5.1 to_csv()
import pandas as pd
data = {
'Name': ['mc', 'jw', 'ly'],
'Age': [26, 25, 24],
'City': ['ShangHai', 'SuZhou', 'XuZhou']
}
df = pd.DataFrame(data)
df.to_csv('data.csv', index=False) # 若不加index=False,会将行索引作为单独一列存储
5.2 read_csv()
import pandas as pd
df = pd.read_csv('data.csv')
print(df)
6. 绘图
import pandas as pd
import matplotlib.pyplot as plt
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 25, 30, 40]
}
df = pd.DataFrame(data)
# 柱状图
df.plot(kind='bar')
plt.show()
# 折线图
df.plot(kind='line')
plt.show()
# 直方图
df['A'].plot(kind='hist')
plt.show()
# 散点图
df.plot(kind='scatter', x='A', y='B')
plot.show()
# 饼图
series = pd.Series({
'A': 10,
'B': 20,
'C': 30,
'D': 40
})
series.plot(kind='pie', autopct='%1.1f%%')
plt.show()
作者:Seven·Yi