写在前面:
本贴主要适用pandas dataframe~
整理的比较潦草,忍一忍,用目录跳转吧,有时间了我再更新和整一下格式哈~
欢迎铁子们留言分享常用(忘)操作~
常用操作
查看数据
df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape:查看行数和列数
df.info():查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
切片
df['A']#根据列名,并以Series的形式返回列
df[['A','B']]#以DataFrame形式返回多列
print(df.columns)#打印列名
df.iloc[0,0]
df.iloc[:,1:]#选择列
df[3:5]#得到行数据
df.iloc[3:5,0:2]
df.loc[:,['A','B']]
df.iat[1,1]#用于提取某个数字
df.values[:,:-1]:返回除了最后一列的其他列的所以数据
df.query('[1, 2] not in c'): 返回c列中不包含1,2的其他数据集
loc与iloc
loc是指location的意思,iloc中的i是指integer
- loc works on labels in the index.(即标签索引)
- iloc works on the positions in the index (so it only takes integers).
(位置索引,只能是数字)
空值处理
pd.isnull()#检查空值,返回Boolean数组
pd.notnull()#检查非空值,返回Boolean数组
df.dropna()#删除所有包含空值的行
df.dropna(axis=1)#删除所有包含空值的列
df.dropna(axis=1,thresh=n)#删除所有小于n个非空值的行
df.fillna('w')#用'w'替换DataFrame对象中所有的空值
替换
s.replace(1,'one')#用‘one’代替所有等于1的值
s.replace([1,3],['one','three'])#用'one'代替1,用'three'代替3
df.rename(columns=lambda x: x + 1)#批量更改列名
df.rename(columns={'old_name': 'new_ name'})#选择性更改列名
筛选
条件筛
#多条件筛选
df[(df.num > 0) & (df.year > 2016)]
#筛选后指定返回列
df[['date','id']][(df.num > 0) & (df.year > 2016)]
#isin方法
list=['2017','2019','2009']
df['year'].isin(list)#返回布尔值
df[df['year'].isin(list)]#返回dataframe
正则筛
import re
pattern = r'[0-9]*'
df['b'] = df['a'].apply(lambda s: ''.join(set(re.findall(pattern, s))) )
#这里可以多次.apply(),并且还可以加其他方法比如.sum()
行列计算
求和、累计求和
df['列求和'] = df.apply(lambda x: x.sum(), axis=1)
df.loc['行求和'] = df.apply(lambda x: x.sum())
df['列累积和'] = df['某一列'].cumsum()
df.sum()# 默认对每列元素求和
df.sum(1)# 对每行求和
协方差与相关系数
# 协方差矩阵
cov_df = df.cov()
cov_df.style.background_gradient(cmap='coolwarm').set_precision(2)
# 相关系数矩阵
corr_df = df.corr()
corr_df.style.background_gradient(cmap='coolwarm').set_precision(2)
获取唯一值
df['a'].unique() #以数组形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
df['a'].nunique() #返回的是唯一值的个数
列数据的类型转换
# series转dataframe(同时,将index保留为变量)
#方法一
new_df=pd.DataFrame({'a':series.index, 'b':series.values})
#方法二
df1 = pd.DataFrame(data=series.index, columns=['a'])
df2 = pd.DataFrame(data=series.values, columns=['b'])
new_df = pd.merge(df1, df2, left_index=True, right_index=True)
# 更改某列数据类型,如数字转字符
df['a']=df['a'].astype(str)
df[['two', 'three']] = df[['two', 'three']].astype(float)
df['datatime']= pd.to_datetime(df['datatime'])
某列字符串拼接
#对列的字符串进行相连
"".join(df['x'])
#对行的字符串进行相连,结果存在新的一列
df['new'] = df['x']+df['y']+df['z']
删除某列有缺失值的行
u17 = u17.dropna(subset=["funny", "fans"])
#删除列
df=df.drop('label', axis=1)
索引&排序
# 重置索引
df=df.reset_index(drop = True)
# 更改索引列
df.set_index('column_one')
df.rename(index=lambda x: x + 1)#批量重命名索引
# 查看索引有重复的数据
df[df.index.duplicated()]
df = df[~df.index.duplicated()] #去重
#按指定列排序
df.sort_values(by="sales" , ascending=False)
数据分箱
pd.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)
x:需要切分的数据
bins:切分区域
right : 是否包含右端点默认True,包含
labels:对应标签,用标记来代替返回的bins,若不在该序列中,则返回NaN
retbins:是否返回间距bins
precision:精度
include_lowest:是否包含左端点,默认False,不包含
举个栗子:
listBins = [0, 15, 30, 60,180,600,900,1800,3600,5400,425484]
listLabels = ['0-15s','16-30s','31-60s','1-3min','3-10min','10-15min','15-30min','30-60min','60-90min','>90min' ]
df['group']=pd.cut(df['duration'], bins=listBins, labels=listLabels, include_lowest=True,right=False)
分组 groupby
#生成dataframe数据
salaries=pd.DataFrame({
'name':['BOSS','Lilei','Lilei','Han','BOSS','BOSS','Han','BOSS'],
'Year':[2016,2016,2016,2016,2017,2017,2017,2017],
'Salary':[999999,20000,25000,3000,9999999,999999,3500,999999],
'Bonus':[100000,20000,20000,5000,200000,300000,3000,400000] })
group_by_name=salaries.groupby('name')
print(type(group_by_name))
for name,group in group_by_name:
print(name)
print(group)
print(group_by_name[['Year','Bonus']].count())
group_by_name[['Salary','Bonus']].agg(sum)#使用聚合函数
group_by_name.get_group('Lilei')
#分组后,对其余各columns做多种统计运算
print(group_by_name[['Bonus','Salary']].agg(['count','mean','std']))
t0 = group_by_name[['Bonus','Salary']].agg(['count','mean','std'])
sns.relplot(data=t0.iloc[:,0],kind='line')
sns.barplot(x="name", y="Bonus", hue="Year", data=salaries)
plt.plot(x=t0.index, y=t0.iloc[:,0], c = 'y')
t0.iloc[:,[0,1,2]]
#size跟count的区别: size计数时包含NaN值,而count不包含NaN值
.size()
.count()
plt.grid(linestyle='-.')
t0.plot(y=[1,4],label = ["test",'ou'])
plt.show()
salaries.iloc[:,[0,1]]
#按多个列分组
group_by_name_year=salaries.groupby(['name','Year'])
print(group_by_name_year.count())
group_by_name_year.groups
日期计算 datetime
#获得今天的日期
import time
now = time.strftime("%Y-%m-%d %H:%M:%S")
today = dt.datetime.today()
z['date'].dt.time #获得时间
其他
# 读取某些列,生成新的DataFrame
newDf = pd.DataFrame(df, columns=[column1, column2, column3])
#Generate a new DataFrame or Series with the index reset.
#pandas.Series.str.contains
#用于判断Series的字符串中是否包含待匹配的模式或者正则表达式,返回的是一个boolean Series。
Series.str.contains(self, pat, case=True, flags=0, na=nan, regex=True)