Python | pandas 使用 速查

Python

注释中的路径不能使用 \ ,只能用 \\ 或者 / ,否则执行的时候还是会报Unicode 编译错误

函数和类的注释放在函数和类下面

def abe():
"""
comment
"""

filter 过滤参数

list(filter(lambda s: not s.startswith("_"), list0)) # 对 list 进行过滤,返回符合条件的 结果列表  

#使用 regex 查找并返回有 orders 的 列表item ,返回只有 orders 的列表
#1
regex = re.compile(r'orders.')
ll = list(filter(regex.search, list0))
#2    
ll = list(filter(lambda x:re.findall('orders',x), list0))


# remove not wanted characters
# 在一个List中去除另外一个List中已经存在的元素
l1 = ['b','c','d','b','c','a','a'] 
l2 = ['c']
l3 = [] 
[l3.append(i) for i in l1 if not i in l2] 
print(l3)

Python StringIO及BytesIO包使用方法解析

set

set=set()
set.add(e)

str = ','.join(set) #set 转 str

Python String

长字符串换行

"""长字符串换行"""
sql_tbl = ("SELECT TABLE_NAME, CREATE_TIME, UPDATE_TIME FROM information_schema.tables "
        "WHERE table_schema = 'test' AND Table_name LIKE '{}' "
        "ORDER BY CREATE_TIME DESC LIMIT 10"
        ).format(table_wc)

Python OS

"""删除文件"""
import os
if os.path.exists("demofile.txt"):
  os.remove("demofile.txt")
else:
  print("The file does not exist")

"""得到文件名"""
os.path.basename(out_path)
"""
py> china.xlsx

"""得到文件名,不含扩展名"""
filename = os.path.splitext(os.path.basename(path))[0].strip()
"""
py> china


"""rename"""
os.rename(src_path,dst_path)

"""得到代码所在文件和所在行"""
import sys
print(f"代码所在文件 = {__file__}"
print(f"代码所在行号 = {sys._getframe().f_lineno}")

Import 

导入其他目录下的 py 文件

    import sys
    sys.path.append(r"C:\\Users\\XXX\\MyPy\\Dir")
    import file as mf

Python Pandas

pandas 教程 - 盖若

DataFrame MetaData

df.shape[0] # 返回行数

删除数据

df = df.drop(0) # 删除第一行

df1 = df.drop(labels='abc', axis=1) # 删除 列名=abc 的列

"""删除第一列"""
df = df.iloc[:, 1:] # 获得1开始的所有列

# 删除满足条件的行:
# 保留第一列中不是 15444 的所有行
# 删除第一列中 数值 为 15444 的所有行 
df1 = df[ df[0] !='15444'] # index 仅用于 Int 列 ?

# 删除字段CountryName = 'Total' 的所有行
dfa = dfa[ dfa['CountryName'] !='Total']

# 删除含有 abc  = -1 的所有行
df = df[ ~df['abc'].isin([-1])]


"""删除Nan 的行和列"""
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# axis = 0 , index; axis = 1, column


dfr = dfr.drop(len(dfr)-1,axis=0) # 删除最后一行

"""直接得到新的DataFrame"""
df = df [['col1','col2']]

df.drop(df.tail(n).index) #从尾部去掉 n 行
df.dorp(df.head(n).index) #从头去掉 n 行

数值替换

# 在数据处理过程中用到了除法,并且出现了除数为0,导致出现inf,而数据库不支持写入该值
df_d = df_d.replace([np.inf, -np.inf], 1) # 第一次出现 - 1
df_d = df_d.replace([np.inf, -np.inf], np.nan) # 空值 ,上述代码将处理结果中的正无穷和负无穷都替换为空值,最后写入到数据为中的为null值
df_d.fillna(0)  # 替换 NaN 为 0 

数据替换

h[0] = h[0].astype('str').apply(lambda x:re_sub(r'.0','',x)) 
# change to str and replacy '.0' with ''

def re_sub(pattern, value, text):
    return re.sub(pattern,value,text)

数据去重

data.drop_duplicates(subset=['A','B'],keep='first',inplace=True,ignore_index=True)

""" 
代码中subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。
默认值为subset=None表示考虑所有列。
 
keep='first'表示保留第一次出现的重复行,是默认值。keep另外两个取值为"last"和False,
分别表示保留最后一次出现的重复行和去除所有重复行。
Flase 可以用于取差集
 
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。

ignore_index:如果为True,则重新分配自然索引(0,1,…,n - 1)

"""

df2 = df1.drop(index=df1.index) """清空数据"""

读文件

df = pd.read_csv('D:/Temp/XYZ.csv')
df = pd.read_excel('D:/Workspace/MyPy/TEST/words_train/toTrain.xlsx',hearder=1)
df = pd.read_sql_query(sql,engine)

# header 指定表头所在行,默认0 初始值

写文件

df_r.to_csv()    #写入CSV
df_r.to_excel() # index = False 写文件时,不输出Index列 



dtypedict = {
    'Name': NVARCHAR(length=255),
    'ID': INTEGER(),
    'Address': NVARCHAR(length=512),
    'Phone Number': NVARCHAR(length=128),
    'Country': NVARCHAR(length=128),
    'Country Code': NVARCHAR(length=4),
    'Category': NVARCHAR(length=8),
    'Zip Code': NVARCHAR(length=62),
}
df.to_sql() # if_exists: append | replace ; dtype:= dict

to_sql 尽量定义dtype 加速 mysql 的写入

初始化 - 新建 dataframe

# Create a dataframe with Data
import pandas as pd
dict_data = {
	'name':["Li Lei","Han Meimei","Tom"],
	'score'	:[95,98,92],
	'gender':['M','F','M']
}

df_data = pd.DataFrame(dict_data)
print(df_data)

# Create a dataframe with Column only
df = pd.DataFrame(columns = ["ebayno", "p_sku", "sale", "sku"]) #创建一个空的dataframe

# Tuple to Datafrom
df1 = pd.DataFrame(rows)

# 新建一行
dict_new_row = [{'aaa':'123', 'id':'322','匹配字段':'all'}]
df_row = pd.DataFrame(dict_new_row)
# 多行用 list 中多个 dict

MySql

# read mysql get dataframe
args['connStr'] = 'mysql+mysqlconnector://root:{}@{}:3306/{}'.format(MysqlPW,MysqlHost,MysqlDB)
df = pd.read_sql_query(sql,engine/ConnStr)

# 将data写入数据库,如果表存在就替换,将data的index也写入数据表,写入字段名称为id_name
data.to_sql('table_name',con='engine',chunksize=10000,if_exists='replace',index=True,index_label='id_name',dtype=dtypes)
# dtype 定义数据格式
# 将data写入数据库,如果表存在就追加
data.to_sql('table_name',con='engine',chunksize=10000,if_exists='append')
# 将data写入数据库,如果表存在就替换,指定col_1的字段类型为char(4)
data.to_sql('table_name',con='engine',chunksize=10000,if_exists='replace',dtype={'col_1':'CHAR(4)'}, index=Ture, index_label=['abc'])

"""
如果data数据量大,需要设置合理的chunksize值,这和数据库缓存大小有关,
可以设置在50000-10000,如果提示数据库连接超时错误,就将size值调小。

index:Write DataFrame Index as a column
index_label: 设置 label for index column(s). 当上一个参数index为True时,设置写入数据表时index的列名称。
index 也写入数据表,写入字段名称为abc
"""

# 使用 sqlalchemy 加入主键Key
from sqlalchemy import create_engine
import sqlalchemy
with engine.connect() as con:
    con.execute('ALTER TABLE tmpTbl ADD PRIMARY KEY (`tmpId`)')

插入

DataFrame.insert(loc, column, value, allow_duplicates=False) # 插入一列

df.insert(loc=2, column='c', value=3)  # 在第三列,插入值全为3的c列


jobs = ['student','AI','teacher']
df['job'] = jobs  #默认在df最后一列加上column名称为job,值为jobs的数据

pandas insert spec doc

添加

new_row = {'name':'Geo', 'physics':87, 'chemistry':92, 'algebra':97}
#append row to the dataframe
df_marks = df_marks.append(new_row, ignore_index=True)
### FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

df1.append(df2)  """相当于pd.concat([df1, df2])"""

数据类型

print(dataframe.dtypes) #查看column 的数据类型

#查看字段名字和类型
for column in df: print(column,',type(column):',type(column))

# 进行数据表格的数据类型转换需要用到数据类型转换函数df["列名称"].astype("类型名称”)
df["A"]=df["A"].astype("int") 
# a lot of long int when loaded by Pandas are treated as float, we need to change back to int for the join.

df_pe['A'] = df_pe['A'].apply(lambda x:x.replace(',','')).astype(float) # 转换有逗号,的数值为 float

"""转成 list"""
df['a'].to_list() # 把字段值转为list

"""转成 没有column name 的 tuple list"""
df.to_records(index=False).tolist()

python - Pandas convert dataframe to array of tuples - Stack Overflow

日期操作

    dfp['creationMonth'] = dfp[columnNames['creationDate']].dt.strftime('%Y-%m')
    dfp['creationWeek'] = dfp[columnNames['creationDate']].dt.strftime('%Y-%W')

列值操作

df['thing'] = df['thing'].str.upper() #将列的所有值转换成大写 

切片

官方: 

Purely integer-location based indexing for selection by position. --iloc

Access a group of rows and columns by label(s) or a boolean array. --loc
————————————————

loc函数:通过行索引 “Index” 中的具体值来取行数据(如取"Index"为"A"的行
iloc函数:通过行号来取行数据(如取第二行的数据
注:loc是location的意思,iloc中的i是integer的意思,仅接受整数作为参数。

"""iloc始终坚持一个原则:iloc是基于position, index 进行索引的! 按照 ROW """

df0.iloc[0] """得到第一行的数据"""

"""打印前10行数据 == df.head(10)"""
for i in (0,10): 
    print(df_ka.iloc[0:i:1]) 

df0.iloc[:,8:] """得到第8列到最后的所有列"""

dfa[-1:] # [-1:] 得到最后一行df

df.head(N) """得到起始N行"""
df.tail(N) """得到最后N行"""

转置

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

行循环

for i,row in df_rt2m.iterrows():
  v0 = row['aaa']
  v1 = row['bbb']

数据查找,筛选

"""得到 p==0 并且 pu=1 的所有数据"""
"""()括号不能省略,否则报错"""
dfu = dfu[ (dfu[p]==0) & (dfu[pu]==1) ]

"""得到 abc 列 中有 -1 值的所有列 """
df = df[df['abc'].isin([-1])]

"""查找满足条件的字符串,支持Regex"""
dftmp = df.loc[df['Name'].str.contains(filter[f][c]),:]


""" 建立一个Array """
filter_list = [12, 14, 15]
#return only rows where points is in the list of values
df[df.points.isin(filter_list)]

移除空行

df2=df.dropna(axis=0, how='all', thresh=None, subset=None, inplace=False) #只有全部为空才回被删除

列名,重命名

df.columns=['A','B']  #rename the dataframe column of every column, when we don't know exactly the column name

df = df.rename( columns={ 'A':'aa', 'C':'cc'  }) # 对Column 重命名


fields = df.columns.values #得到列名

""" 将 PD.seriesName 转为 pd.columns 才能对列重命名 """
df = pd.DataFrame({"a":np.arange(10),
                   "b":np.random.choice(["A","B"],10)})
avg = df.groupby("b", sort=False)["a"].mean().reset_index(name="mean")

avg = df.groupby("b", sort=False)["a"].mean().reset_index().rename(columns={"a":"mean"})

# 在计算聚合后得到的 series, 可以使用 reset_index() 转为 Column
avg = df.groupby("b", sort=False, as_index=False)["a"].mean()\
        .reset_index()\
        .rename(columns={"a":"mean"})

数据合并

df = pd.merge(df_search,df_pe, on=['col1','col2'], how='outer' , suffixes=('','')) 
# out join 数据左右连接,suffixes 为合并后的左表和右表的后缀

"""按列合并"""
df = pd.concat([df0,df1])

索引,排序

df.reset_index(drop=False) # False - transform the Index to normal fields, True - Drop the Index

df0 = df0.sort_values(by=[column1], ascending=[False])

# 设置索引字段
df_cx.set_index('Tag',inplace=True)
# 通过索引字段中的值,得到其相应其他字段的值
n = df_cx.loc[k,'Name'] # retrun value
n = df_cx.loc[k,['Name','Explain']] # retrun DataFrame

统计 - 计算

df_f['sum'] = df_f.apply(lambda x: x.sum(), axis=1) # 对所有的agg以后的数值列求和,插入一列

df['sum'] =df['2020-03-30'].add(df['2020-03-31'], fill_value=0)     #按列相加,NaN 的地方 用 0 填充

df['avg'] = df.apply(lambda x: x['bookings'] / int(N)  , axis=1) # 整列 除 N,作为新的一列

len(df) # dataframe 行数
df.size # dataframe 单元格数,不含Index


df['sum'] = df.sum(axis=1) # sum all columns in one row. 字符串自动连接

            

统计 - 汇总 (GroupBy)


df_group_r_errors = df[['Data.Request','_type']].groupby(by=['Data.Request']
   , as_index=True)
# as_index - groupby 的字段作为Index 字段,方便日后根据 Index 进行 concat
# by - 分组 Aggregate 的字段列表
df_r_count = df_group_r_errors.count() # count() - 分组汇总,每组中的个数
""" .sum() - 总和;.mean() 均值 """

df0 = dataFrame.groupby(['clientName']).agg({'GMV':['sum'],'bookings':['sum'],'COST':['sum']})
df0.columns=['GMV','bookings','cost']  #rename the datafram series
df0 = df0.reset_index(drop=False)

"""对一个字段求多个group 后的 统计值,并且重名字段名"""
df_result = df.groupby('col1').agg(
  speed_avg=('speed', 'mean'), speed_min=('speed', 'min'), speed_max=('speed','max') 
  ,vol=('Id', 'size'),spread=('speed',lambda x:max(x)-min(x)
).reset_index()

""" groupby 后,filter所需的值 """
filter = df.groupby('Team').filter(lambda x: len(x) >= 3)

数据校验

pd.isnull(row['a']) # 校验是否为空或者nan
pd.notnull(row['a']) # 校验是否不为空或者nan

Reference

Pandas对于CSV的简单操作

python – 在列表中通过正则表达式过滤字符...

Pandas之超好用的Groupby用法详解

Python: pandas中iloc, loc和ix的区别和联系

pandas 查询筛选数据 | pandas 教程 - 盖若

pandas DataFrame.to_sql() 用法

pandas数据表处理之数据的分类与汇总(2) 

pandas数据汇总

Python3之接口类(InterfaceClass)浅谈

pandas dropna()移除空行

从pandas日期列中提取年份与月份的三种方法

你可能感兴趣的:(Python,python,pandas)