跟着[孙兴华]老师学习——收获满满
1——DataFrame
1.1 日期差值
m = d[‘结束时间’] - d[‘起始时间’]
d[‘天数’] = m.apply(lambda x: x.days)
1.2 name属性
1.3 排序
import pandas as pd
路径 = 'e://workspace//pandas/排序.xlsx'
data = pd.read_excel(路径,index_col='序号') ## 序号作为索引
data.sort_values(by=['数学', '语文', '生物'], inplace=True, ascending=[False,True, False])
data.sort_index(inplace=True) ## 索引排序
1.4 数据查询loc
import pandas as pd
路径 = 'e://workspace//pandas/筛选.xlsx'
data = pe.read_excel(路径, index_col ='出生日期')
data.loc['2018-08-20':'2022-08-10',['数学', '语文', '英语']]
data.loc[(data['语文'] > 80) & (data['数学'] >= 90)]
data.loc[data['性别']=='男, '称呼'] = '先生' ## 添加一个新的列
data.loc[data['性别']=='女, '称呼'] = '女士' ## 添加一个新的列
data1 = pd.read_excel(路径, index_col='序号', sheet_name='Sheet2')
d1 = data1.loc[2:4] # 2-4行
条件1 = data1.loc['性别'] == '男'
print(data1[条件1])
条件2 = "性别=='男' and 总分 >= 150"
条件3 = "语文 <= 90 and 总分 >= 450"
data1.query(条件2) ## 使用query填写条件
条件 = data1['姓名'].str.startswith('王')
条件 = data1['地址'].str.contains('武汉')
条件 = data1['地址'].str.contains('[a-cA-C]座') ## 从爬虫教程,学习正则表达式
1.5 获取某个日期之前之后的数据切片
data2 = pd.read_excel(路径, index_col='出生日期', parse_dates=['出生日期']) ## 日期处理
data2 = data.sort_values('出生日期')
data2.truncate(before='1980').head() ## 1980以后的数据; 类似 a <= x <= b中的a,即>=a的值符合条件
data2.truncate(after='1990-12').head() ## 1990-12之前的数据
data2.truncate(before='1995-07 21:09:28').head() ## 1995-07以后的数据
data2['1980':'2022'] ## 1980以后的数据;
data2['1980-01-1':'2022-06-08'] ## 1980以后的数据,默认取所有的列
条件 = (
'@data1.出生日期.dt.year > 1980 and'
'@data1.出生日期.dt.year < 1995 and'
'性别 == "男"'
)
data1.query(条件)) ## 这种写法的时候,不能把日期当作索引
1.6 drop()用法
路径 = 'e://workspace/pandas/drop练习.xlsx'
data = pd.read_excel(路径, index_col='序号')
data.drop(labels=[1,3]) ## 删除多行数据
data.drop('语文', axis=1) ## 删除单列数据
d1 = data.drop(labels=['语文', '数学'], axis=1) ## 删除多列数据,不保存修改,生成新对象
data.drop(labels=['语文', '数学'], axis=1, inplace=True) ## 删除多列数据
1.7 缺失值处理
axis=0 删除有空值的行
asix=1 删除有空值的列
how=all any
axis=0, thresh = 10 缺失值少于10个,删除该行
subset:list
data1.isnull()
data1.notnull()
data1.dropna(axis=1) ## 有空值的列就删
data1.dropna(how='all') ##某一行都是空才去删除
data1.dropna(subset=['语文', '数学']) ## 只对该两列有空值,进行删除操作
data1.fillna(520) ## 空值一律填充520
data1.fillna({'语文':0.1, '数学':0.3, '英语':0.66}) ## 不同列空值不同值填充
data1.fillna(method='ffill') ##用前面的值填充ffill———bfill pad(向后填充)———backfill(向前填充)
data1.fillna(method='bfill', limit=2) # 最多填充2个
1.8 数学统计函数
data1.describe()
data1['数学'].deecribe()
data1['语文'].median()
data1['语文'].cov()
data1['语文'].corr()
1.9 处理重复值
data = pd.read_excel(路径)
print(data['姓名'].unique())
print(data['姓名'].value_counts())
data.drop_duplicates(subset=['姓名'],keep='last') ## 保存最后一个重复值 first,last,False
重复 = data.duplicated(subset=['姓名', '年龄'])
print(data[重复])
1.10 处理数值计算 vs 多层索引 vs 数据替换
import pandas as pd
pd.options.mode.use_inf_as_na = True # 无穷大inf当作nan来处理
data = {
'班级': ['1班', '1班', '2班', '2班', '3班', '3班'],
'学号': ['a', 'b', 'c', 'a', 'b', 'c'],
'分数': [10, 20, 30, 40, 50, 60]
}
df1 = pd.DataFrame(data)
路径 = 'e://pandas//多层索引.xlsx'
df2 = df1.set_index(['班级', '学号']) # 法1
df3 = pd.read_excel(路径, index_col=[0, 1]) # 法2
print(df2.loc['1班'])
print(df2.loc[('1班', 'a')])
print(df2.loc[('1班', slice(None)), :]) # 1班所有行
data.sort_index(level='科目') # 对于无序数据,需要先排序
data.loc[('语文', slice(None),:]
idx=pd.MultiIndex.from_product([[2019, 2010], [5, 6]], names=['年', '月']) # 笛卡尔积产生数据
col = pd.MultiIndex.from_product([['香蕉', '苹果'], ['土豆', '茄子']], names=['水果', '蔬菜'])
数据 = pd.DataFrame(np.random.random(size=(4, 4)), index=idx, columns=col)
-------------------------------------------------------------------------------------
data = {
"name": ['hello', 'bang', 'gua', 'kol', 'lu'],
'area': ['市区', '郊区', '市中心', '乡下', '街区'],
'缩写': ['A', 'A', 'B', 'B', 'A']
}
df1 = pd.DataFrame(data)
df1['缩写'].replace(['A'], ['25'], inplace=True) # 直接替换
df1['缩写'].str.replace('A', '25', inplace=True) # 字符串替换
d = {'B':30}
df1['缩写'].replace(d, inplace=True) # 使用字典来替换
df1['缩写'].replace(['A-Z'], regex=True, inplace=True) # 使用正则表达式