pandas
dataframe
由 Series 组成的字典
import pandas as pd
from pandas import np
# Series 列
pd.Series(range(10))
# dataframe 列集合
# [1, 2] 第一行
data = pd.DataFrame([["lili", 23], ['lisa', 25]], [1, 2], ["姓名", "年龄"])
# pd.DataFrame( data, index, columns, dtype, copy)
# data:一组数据(ndarray、series, map, lists, dict 等类型)。
# index:索引值,或者可以称为行标签。
# columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
# dtype:数据类型。
# copy:拷贝数据,默认为 False。
列标签
data.columns
行索引
data.index
获取指定列
data['姓名']
data[["姓名", "年龄"]]
loc 通过行索引 “Index” 和 columns中的具体值来取行数据
# 第一行
data.loc[1]
# 姓名 lili
# 年龄 23
# 第一行 姓名 列
data.loc[1, "姓名"]
# 第一二行
data.loc[[1,2]]
# 获取一二行,年龄 和 姓名 的数据
data.loc[[1, 2], ["年龄", "姓名"]]
# 筛选年龄 > 10的数据
data.loc[data['年龄']>0]
iloc 通过行号和列号来取行数据
# 第一行二列
data.iloc[0, 1]
# 第一二行,一二列
data.iloc[[0, 1],[0, 1]]
条件过滤
data[data != np.nan]
data[data["姓名"] == "lili"]
# 多重筛选
df = pd.DataFrame({"name": ['123', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": ["123", pd.Timestamp("1940-04-25"),pd.NaT]})
df[(df['name'] == "123") & (df['born'] == "12")]
索引排序
df = pd.DataFrame({"name": ['123', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": ["123", pd.Timestamp("1940-04-25"),pd.NaT]})
# sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None)
# axis:0按照行名排序;1按照列名排序
# level:默认None,否则按照给定的level顺序排列---貌似并不是,文档
# ascending:默认True升序排列;False降序排列
# inplace:默认False,否则排序之后的数据直接替换原来的数据框
# kind:默认quicksort,排序的方法
# na_position:缺失值默认排在最后{"first","last"}
# by:按照那一列数据进行排序,但是by参数貌似不建议使用
df.sort_index(1, ascending=True)
值排序
sort_values(
self,
by,
axis=0,
ascending=True,
inplace=False,
kind="quicksort",
na_position="last",
)
df.sort_values(["name"], ascending=[True])
df.sort_values(["name", "toy"], ascending=True)
df.sort_values(["name", "toy"], ascending=[True, False])
添加默认值
data.fillna("")
删除空值
data.dropna(self, axis=0, how="any", thresh=None, subset=None, inplace=False)
# axis : 0 表示行 1 表示列
# how:any 包含, all 全空
# thresh:int 包含空个数
# subset:指定在哪些列判断是否为空
# inplace:True 修改源数据,False不返回源数据
df = pd.DataFrame({"name": ['123', 'Batman', 'Catwoman'],
"toy": [np.nan, 'Batmobile', 'Bullwhip'],
"born": ["123", pd.Timestamp("1940-04-25"),pd.NaT]})
规范数据类型
# duration 列数据类型为int
pd.read_csv('../data/moive_metadata.csv', dtype={'duration': int})
数据替换
df.replace(
self,
to_replace=None,
value=None,
inplace=False,
# limit =None,
regex=False,
method="pad",
)
# method:填充方式,pad,ffill,bfill分别是向前、向前、向后填充
# limit
df.replace("123", "one")
# 指定列
df.replace({"toy": "123", "name": "123"}, "one")
# 多值替换
df.replace(['123', 'Batman'], ['one', "two"])
df.replace(['123', 'Batman'], 'one')
# 正则替换
df.replace("\d+", "one", regex=True)
#
df.replace('123',method='bfill') #用123下面的最靠近非123的值填充
df.replace('123',method='ffill') #用123上面最靠近非123的值填充
df.replace('123',method='pad') #用123上面最靠近非123的值填充
列重命名
df.rename(columns={"name": "nameXXXX"})
apply 执行方法
apply(
self,
func,
axis=0,
broadcast=None,
raw=False,
reduce=None,
result_type=None,
args=(),
**kwds
)
axis: 0:index->对每列执行方法,1:columns,对每一行或者列执行方法
result_type: broadcast、reduce、expand,broadcast保持行列不变
df = pd.DataFrame([[4, 9]] * 3, columns=['A', 'B'])
# 所有值求平法
df.apply(np.sqrt)
# 列求和
df.apply(np.sum, axis=0)
#
df.apply(np.sum, axis=1, result_type='reduce')
# 0 13
# 1 13
# 2 13
df.apply(np.sum, axis=1, result_type='broadcast')
# A B
# 0 13 13
# 1 13 13
# 2 13 13