美文网首页
DataFrame常用基本操作

DataFrame常用基本操作

作者: estate47 | 来源:发表于2020-02-07 14:57 被阅读0次

1.对DataFram进行合并操作

data = pd.merge(df1,df2,left_on = "名称",right_on = " 姓名")  #对数据进行左右合并
data = pd.concat([df1,df2,df3,df4],axis = 0)  #对数据进行上下合并
df_inner=pd.merge(df,df1,how='inner')
df_left=pd.merge(df,df1,how='left')
df_right=pd.merge(df,df1,how='right')
df_outer=pd.merge(df,df1,how='outer')

2.在字段中对数据进行模糊匹配,相当于excel中的关键字查找
筛选出姓名列中包含"张"的数据:

data = df[df["姓名"].str.contains(r'.*?张.*')]
data = df[df["姓名"].isin(["张"])]
data = df[~df["姓名"].isin(["张"])]  #通过~取反,筛选出姓名列中不包含"张"的数据

3.将"地址"字段所有数据保留前5个字符(注意:前闭后开)

df[" 地址"] = df["地址"].str[0:5]

4.将[{'a':'int','b':'str'},{'a':'cat','b':'dog'}]变成datafram

df = pd.DataFrame(newlist)

5.将dataframe写到表格中,可以保存为csv和xlsx格式(注意:encoding在中文显示乱码的情况下要修改编码格式)
pandas往csv里写文件时0丢失的问题:在字符串前面加上"\t"就能正常作为文本写入csv

data[代码] = "\t" + data[代码]    #可以保留代码前的0
df.to_csv('data.csv',encoding = 'utf-8-sig',index = None)  #不要行号
df.to_csv('data.csv',encoding = 'utf-8-sig')  #要行号
df.to_excel('data.xlsx',encoding = 'utf-8')

6.删除姓名列中含有空值的那一行

df1 = df1[df1["姓名"].notna()]  #删除None所在的行
df1 = df1.dropna()
df1 = df1.dropna(axis = 0,how = 'all')   #删除整行都是空的
df1 = df1.fillna(" ") #把空值填成字符串

7.更改列名及更改列字段的值

df1.rename(columns = {"name":"姓名","id":"序号"},inplace = True)
data['是否在职'] = data['是否在职'].replace('1','在职')
data['是否在职'] = data['是否在职'].replace('0','离职')

用判断语句进行修改,1为在职0为离职,因为序列中的多个值不能和单个值比较,所以定义一个变量a

def zhiwei(a):
      if (a == '1'):
          return ' 在职'
      else:
          return ' 离职'
data['是否在职'] = data['是否在职'].apply(zhiwei)

8.删除数据

df1.drop(df[["姓名","地址"]],axis = 1,inplace = True)  #删除某几列
df1 = df1.drop_duplicates()  #删除重复的行
#按列位置删除一列或多列
sql_data.drop(sql_data.columns[[0,1]],axis=1,inplace=True)
df_pledgee = df2[df2['p_stock2220_F006N'].notna()]
  # 删除None所在的 行
df= df.dropna()
#删除重复的某行保留第一条
df = df.drop_duplicates(subset=['fund_id'],keep='first',inplace=True)

9.用groupby做分组运算(注:按“姓名”进行分类,将同一组的“次数”求和)

df1 = df1[[" 次数"]].grouby(df1["姓名"]).sum()
df1 = df1.groupby(["姓名","地址","次数"]).sum()
df1 = df1.reset_index()  #把索引变成列名
df1 = df1.sort_values(by = "次数",ascending = True)  #排序
#筛选每组中最大的
df.groupby('fund_code').apply(lambda t: t[t.market_date==t.market_date.max()]) 
#groupby后保留原来的列
df_company = df[['customerId']].groupby(df['companyCode']).count().reset_index()
df_data.groupby(['FirstIndustryName'])['price_limit'].mean().reset_index()
df.groupby(['fund_code', 'market_date', 'subject_id']).sum()['market_value'].reset_index()
#分组移动求某一时间段的最大值
data_base['quotationLocal_max'] = data_base.groupby(['subjectName', 'companyCode', 'fundCode'])['quotationLocal'].cummax()
#分组滚动求值
fund_data['stock_sale_earn'] = fund_data.groupby(['companyCode', 'fundCode', 'subjectCode']).apply(
        lambda x: (x['number'].shift(1) - x['number']).map(lambda x: x if x > 0 else 0) * (
                    x['quotation'] - x['quotation'].shift(1))).values

10.多列合并及拆分

df1["信息"] = df1[["姓名","地址"]].apply(lambda x:'/'.join(x),axis = 1)
df1["姓名"] = df1["信息"].map(lambda x:x.split('/')[0])
df1["地址"] = df1["信息"].map(lambda x:x.split('/')[1])
拆分字符串(rsplit从后往前)
df1["信息"] = df1["信息"].str.rsplit('',1)
#对category字段的值依次进行分列,并创建数据表,索引值为df_inner的索引列,列名称为category和size
pd.DataFrame((x.split('-') for x in df_inner['category']),index=d
f_inner.index,columns=['category','size'])  


11.条件筛选(时间)

df1 = df1[(df1['data'] >= start_day) &
                (df1['data'] <= end_day) &
                (df1['seccode'] == seccode) ]['df1num']

12.处理缺失值

def remove_the_null(data,data1,a):  #第二个参数:当缺失率达到多少时,直接删除
      t = []
      for col_name in data.columns:
            changdu = len(data[col_name])
            cnt = list(data[col_name].isna()).count(True)
            if (cnt / changdu > a):
                del data[col_name]
                del data1[col_name]
                t.append(col_name)
      return data,data1,t

df.fillna(value = 0)  #使用0对NA进行填充
df['price'].fillna(df['price'].mean())  #使用price均值对NA进行填充
df.isnull()  #检查数据空值
df['price'].isnull()  #检查特定列空值

13.Series取成一个值

df1 = df1.iloc[0]
df_inner.iloc[:3,:2]  #使用iloc按位置区域提取数据
df_inner.iloc[[0,2,5],[4,5]]  #使用iloc按位置单独提取数据

14.dataframe转置

df1 = pd.DataFrame(df.values.T, index = df.columns, columns = df.index)

15.将DataFrame类型的数据按某一列的值拆分成多个DataFrame类型的数据

class = data["地址"].unique()
for  i in class:
      data = data[data["地址"].isin([class])]
        

16.利用数据框df的name列中的非空值去填充df的features列中对应的NaN

df.loc[df['features'].isnull(),'features'] = df[df['features'].isnull()]['name']
csv_data = csv_data.fillna(' ')  #把空值填成空字符串

17.转变数据类型astype

df['代码'] = df['代码'].astype(str)
df['代码'] = df['代码'].astype(str).str[0:10].str.replace('-','.')   #转化类型、截取字段、替换数据

18.读数据

cavPath1 = 'excel_name.xlsx'
excel_name = pd.read_excel(cavPath1,encoding = 'utf-8-sig',converters={u'代码':str})  #可以把以0开头的字段转为字符串

19.把list中每个元素加1

l = map(lambda n:n+1,l)

20.pandas DataFrame取列名

DataFrame.columns.values.tolist()

21.给数据前面补0

 s = n.zfill(5)  #用来给字符串补0
s = "%05d" % n  #纯数字,我们也可以通过格式化的方式来补0

22.过滤掉非int的数

if isinstance(days,int):
   if days < 32:
       return f'离{product}付息日 ({timeData})还差{days}天'
    else:
            return ' '
 else:
       return ' ' 

23.转成json文件

class MyEncoder(json.JSONEncoder):
          def default(self,obj):
                 if isinstance(obj,numpy.integer):
                      return int(obj)
                 elif isinstance(obj,numpy.floating):
                      return float(obj)
                 elif isinstance(obj,numpy.ndarray):
                      return obj.tolist()
                 else:
                        return super(MyEncoder,self).default(obj)
filename = 'data.json'
with open(filename,'w') as f:
        json.dump(ret,f,cls = MyEncoder,ensure_ascii = False)

24.对数据进行替换

df["TermIndex"] = df["TermIndex"].raplace([1,2],['一','二'])  #替换"TermIndex"的值,将数字转为中文
translations = {r'(.*)<(.*)' : r'\l&lt;\2' , r'(.*)>(.*) : r'\l&gt;\2'}
df = df.replace(translations,regex = True)  #替换某个字符:数据值中含有<>的使用(只替换最后出现的那个)
data = data.replace('[<]','&lt;',regex = True)  #替换某个字符:数据值中含有<>的使用(替换所有出现的)
data = data.replace('[>]','&gt;',regex = True)

25.合并多个表格到一个sheet中,startcol从第几列开始拼接,startrow第几行开始拼接

df1 = data()
df2 = data()
df3 = data()
writer = pd.ExcelWriter('汇总表.xlsx')
df1.to_excel(writer)
df2.to_excel(writer,startcol = 4)
df1.to_excel(writer,startcol = 8,startrow = 4)
writer.save()

26.对日期的处理

time1['起始日'] = pd.to_datatime(time1['起始日'],format = "%Y-%m -%d")  #转换为日期形式
time1['起始日'] += datatime.timedelta(days = 1)  #日期天数加1
rightTime =  pd.datetime.now() - dateutil.relativedelta.relativedalta(months=6)  #从今天开始往前推半年

27.数据表检查

df.shape  #数据维度(行列):Excel中可以通过CTRL+向下的光标键,和CTRL+向右的光标键
df.info()  #数据表信息:数据维度、列名称、数据格式和所占空间等信息
df.dtypes  #查看数据表各列格式
df['B'].dtype  #查看单列格式
df.values  #查看数据表的值
df['name'].unique  #查看name中的唯一值
df.columns  #查看列名称
df.head()  #查看前10行
df.tail()  #查看最后10行

28.数据清洗

df['city']=df['city'].map(str.strip)  #清除city字段中的字符空格
df['city']=df['city'].str.lower()  #city列大小写转换
df['price'].astype('int')   #更改数据格式
df.rename(columns = {"name":"姓名","id":"序号"},inplace = True)   #更改列名称
df['city'].drop_duplicates()   #删除后出现的重复值
df['city'].drop_duplicates(keep='last')  #删除先出现的重复值
df['city'].replace('sh', 'shanghai')    #数据替换
df = df.sort_values(by="日期",ascending=True) #按某列的值排序
df['a'] = df['mean'].round(decimals=2)  #保留两位小数
df['a'] = df['mean'].map(lambda x:("%.2f)%x)  #不为数值型字段
df['a'] = df['mean'].map(lambda x:format(x,".2%))
df['a'] = df['mean'].apply(lambda x:round(x,2))

29.数据预处理

df_inner=pd.merge(df,df1,how='inner')  #数据表匹配合并,合并的方式还有left,right和outer方式
df_inner.set_index('id')    #设置索引列
df_inner.sort_values(by=['age'])   #按特定列的值排序
df_inner.sort_index()   #按索引列排序
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low
')    #使用Where函数用来对数据进行判断和分组
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price']
>= 4000), 'sign']=1   #对复合多个条件的数据进行分组标记

30.数据提取

df_inner.loc[3]    #按索引提取单行的数值
df_inner.loc[0:5]    #按索引提取区域行数值
df_inner.reset_index()  #重设索引
df_inner=df_inner.set_index('date')  #设置日期为索引

31.数据筛选

#使用“与”条件进行筛选
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beiji
ng'), ['id','city','age','category','gender']]
#使用“或”条件筛选
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beiji
ng'), ['id','city','age','category','gender']].sort(['age'])
#使用“非”条件进行筛选
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age',
'category','gender']].sort(['id'])
#对筛选后的数据按city列进行计数
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age',
'category','gender']].sort(['id']).city.count()
#使用query函数进行筛选
df_inner.query('city == ["beijing", "shanghai"]')
#对筛选后的结果按price进行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum()

32.数据汇总

df_inner.groupby('city').count()  #对所有列进行计数汇总
df_inner.groupby('city')['id'].count()  #对特定的ID列进行计数汇总
df_inner.groupby(['city','size'])['id'].count()#对两个字段进行汇总计数
#对city字段进行汇总并计算price的合计和均值。
df_inner.groupby('city')['price'].agg([len,np.sum, np.mean])

33.Python中通过pivot_table函数实现数据透视

#设定city为行字段,size为列字段,price为值字段。分别计算price的数量和金额并且按行与列进行汇总。
pd.pivot_table(df_inner,index=["city"],values=["price"],columns=[
"size"],aggfunc=[len,np.sum],fill_value=0,margins=True)

34.数据采样

df_inner.sample(n=3)  #简单的数据采样
weights = [0, 0, 0, 0, 0.5, 0.5]  #手动设置采样权重
df_inner.sample(n=2, weights=weights)
df_inner.sample(n=6, replace=False)  #采样后不放回
df_inner.sample(n=6, replace=True)  #采样后放回
df_inner.describe().round(2).T  #数据表描述性统计
df_inner['price'].corr(df_inner['m-point'])  #相关性分析
df_inner.corr()  #数据表相关性分析

35.时间与今天对比
把数据表中给出的时间与今天对比,划分一个时间范围用0和1来判断取值

today = pd.datetime.now()
def dfApply01(d):
    d = datetime.datetime.strptime(d,"%Y-%m-%d") #
    theDay = today + dateutil.relativedelta.relativedelta(days=7)
   #time1['起始日'] += datatime.timedelta(days = 1) 
   if d <=theDay and d>today:
        return 1
   else:
        return 0
dataAll["bool"] = dataAll["最迟时间"].apply(dfApply01)

36.遍历每一个值来读取

def mainStar(data):
    report = data["日期"]
    seccode =  data["代码"]
    secname =  data["简称"]
    year = data["年度"]
    year01 = int(year)+1
    if report == "年报":
        message = f'根据提交的{report}披露时间,{seccode}{secname}需要在{year01}发送报告'
    else:
        message = " "
    return message
df["notice"] = df.apply(mainStar,axis=1)

37.引用模块

import sys, os
base_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #os.path.dirname比文件夹个数多1
sys.path.append(base_path)
from test3 import c

38.数值设置千分位、保留小数点

data["数量"] = data["数量"].map(lambda x:format(x,","))  #设置千分位
data["数量"] = data["数量"].round(decimals = 2)
data["数量"] = data["数量"].map(lambda x:("%.2f")%x)
data["数量"] = data["数量"].map(lambda x:format(x,".2%"))
data["数量"] = data["数量"].apply(lambda x:round(x,2))

39.合并两个字典

from collections import ChainMap
context = dict(ChainMap(data_dic,pic_dic))

40.取出A与B之间的数据

data["max"] = data["tag"].apply(lambda x:(x.partition("A")[2].partition("B"))[0][:])

41.读取json

import json
with open("1.json","r",encoding = "utf-8") as f:
       content = json.load(f)
       print(content)

42.创建excel表格

import numpy as np
import pandas as pd
import openpyxl
data = np.random.randint(10,40,size=(20,4))
columns = ["a","b","c","d"]
df = pd.DataFrame(data = data,columns = columns)
df.to_excel("df.xlsx",encoding="utf-8-sig",index=None)
print(df)

43.忽略警告错误信息

import warnings
warnings.filterwarnings('ignore')

相关文章

网友评论

      本文标题:DataFrame常用基本操作

      本文链接:https://www.haomeiwen.com/subject/oymmnctx.html