python dataframe 切片、筛选、行列处理、分组计算、null统计-更新ing

写在前面:
本贴主要适用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列中不包含12的其他数据集

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)

猜你喜欢

转载自blog.csdn.net/weixin_43545069/article/details/103477262