一、常规操作
1.1 只保留数字
df5['n'] = df5['n'].str.extract('(\d+)', expand=False)
读入文件
1.pandas读.txt文件
使用read_csv就行
2.pandas不读入头部索
data = pd.read_table("brandname.txt",header=None)
计算person系数
data.corr()
一列中的某几类值
sample_list=[2233,1122,1133,1223]
sample_prod_df = all_prod_df[all_prod_df['product_id'].isin(sample_list)]
sample_prod_df
删除
删除控制
df.dropna()
dataframe转list
res.values.flatten().tolist()
agg
data.groupby(['a','b','c']).agg(order_count = pd.NamedAgg(column='a', aggfunc='count').reset_index()
保留两位小数
res['a']=res['mean'].round(decimals=2)
res['b']=res['mean'].map(lambda x:("%.2f")%x)
res['c']=res['mean'].map(lambda x:format(x,".2%"))
print(res)
print(res.dtypes)
修改类型
data_output["name"] = data_output["name"].astype('str')
指定行索引删除
# 删除第一行
df.drop(df.index[0], inplace=True)
删除某一列
data.drop(data.columns[0],axis=1, inplace=True)
del df['columns'] #改变原始数据
df.drop('columns',axis=1)#删除不改表原始数据,可以通过重新赋值的方式赋值该数据
df.drop('columns',axis=1,inplace='True') #改变原始数据
将两列转为字典:
bc_ec.set_index("buscat1")["expat"].to_dict()
修改列名
data_ec = data_ec.rename(columns={'main_sku_id':"标题ID","brand_code":"品牌ID"})
修改
pd.qcut
import numpy as np
from numpy import *
import pandas as pd
df = pd.DataFrame()
df['data'] = [1,2,2,2,2,6,7,8,9,0]#这里注意箱边界值需要唯一,不然qcut时程序会报错
df['cut']=pd.cut(df['data'],5)
df['qcut']=pd.qcut(df['data'],5)
https://blog.csdn.net/qq_37089628/article/details/86501234
分桶后,再确保值落入到每一个区间当中。
qcut 是等频切割,即基本保证每个组里的元素个数是相等的。
cut是按值切割,即根据数据值的大小范围等分成n组,落入这个范围的分别进入到该组。
重置索引
res_a.reset_index(inplace=True)
res_a.reset_index(inplace=True,drop=True) #一般采用这个,不然会新增加一列
df.reset_index(drop=True) 1 这样就会将标签重新从零开始顺序排序。这里可以使用参数设置drop=True删除旧的索引序
explode
https://blog.csdn.net/Andew_lee/article/details/108785964
assign
这个函数的返回值是一个新的DataFrame数据框,包含所有现有列和新生成的列
https://blog.csdn.net/fengdu78/article/details/120465745
多条件并列查询
data_new[(data_new["name"]=="A") & (data_new["B"]==5.0)]
将数据转化为日期类型
pd.to_datetime(data['date'])
生成时间序列
pd.date_range(start='2021-07-01', end='2022-07-20',freq='30D')
https://www.cnblogs.com/chentianyu/p/16086765.html
文件输出
1.输出忽略索引
data_new.to_csv(‘data_new.csv’,index=None)
按照某一列进行排序
https://blog.csdn.net/weixin_33739523/article/details/86133896
data.sort_values("xxx",inplace=True)
ascending 为bool值
多列排序
df.sort_values(by=['4-语文','5-数学'])
选择性赋值
选择某一些列
base_data.loc[base_data["category"].isin(req_cat)] #req_cat是list类型
#给某一列具有B值属性的值赋值
read_ab_data["label"].loc[read_ab_data["label"]=="B"]="BB"
判断某一列中知否有对应字符串
import pandas as pd
series = pd.Series(['abc', 'bcd'])
print(series.str.contains('a'))
统计sku_id的数量
.groupby("sku_id").sku_id.count().shape[0]
缺失值处理
使用DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
value: scalar, dict, Series, or DataFrame
dict 可以指定每一行或列用什么值填充
method: {‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None
在列上操作
ffill / pad: 使用前一个值来填充缺失值
backfill / bfill :使用后一个值来填充缺失值
limit 填充的缺失值个数限制。应该不怎么用
求差集
percentiles=[.1]
.1表示只取中位数和10%分位数。
transform
对sku_id 做groupby后,求均值
np.log(train_data.groupby("id").price.transform("max"))
一列划分为多列
#拆消费时间
consum["日期"]=consum["消费时间"].map(lambda x:x.split(' ')[0])
consum["时间"]=consum["消费时间"].map(lambda x:x.split(' ')[1])
consum[['时间','日期']]
列中存储数组类型
将列中存储的list转为numpy
np.array(data["res"].tolist())
MultiIndex
多索引数据获取
data.index.get_level_values(0)
数据去重
x["col"].drop_duplicates()
drop_duplicates(subset=[‘comment’], keep=‘first’, inplace=True)
data.drop_duplicates() #按照行去重
交集差集
pd.merge(data,statis_sku,on=["id"],how="inner")
输出文件乱码
使用df.to_csv(“test.csv”,encoding=“utf-8”)输出的文件中会出现中文乱码,正确方法是df.to_csv(“test.csv”,encoding=“utf_8_sig”)
修改某一列的函数值
https://blog.csdn.net/qq_19309473/article/details/121006040
merge
合并对齐列,
inner是merge函数的默认参数,意思是将dataframe_1和dataframe_2两表中主键一致的行保留下来,然后合并列。
https://blog.csdn.net/stevenkwong/article/details/52540605?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.base
二、数据拼接
JOIN
join默认按照列进行索引
left=pd.DataFrame(['0','0','0','0','0',"0"], index=[3,3,4,5,6,7],columns=['销量'])
right=pd.DataFrame([13000,15000,9000,8600,10000], index=[3,4,5,6,7],columns=['销量2'])
字典值映射
# 订单表 sku 追加地区
data = data.assign(
area_name=lambda x: x.columns.apply(lambda dicts.get(x)))
类型转化
字典转为pandas
pd.DataFrame(dicts.items())
数据转移操作
等级为groupy的列,日期为转置后的列名,value为具体对应的值
datae.pivot(index='等级', columns='日期', values='单量')
相关操作
查看数据占用多少内存
## 查看df占内存的大小
import timeit
import sys
st = time.time()
print('all_data占据内存约: {:.2f} GB'.format(df.memory_usage().sum()/ (1024**3)))
st1=time.time()
print('costtime: {:.2f} s'.format(st1-st))
print('all_data占据内存约: {:.2f} GB'.format(sys.getsizeof(df)/(1024**3)))
报错信息
编码信息报错
'utf-8' codec can't decode byte 0xa3 in position 79780: invalid start byte
解决
加入:encoding=‘unicode_escape’ /e ncoding=‘gb18030’
import pandas as pd, numpy as np
from datetime import datetime, date
from matplotlib import pyplot as plt
import seaborn as sns
df = pd.read_csv('./OnlineRetail.csv',encoding='unicode_escape')