python的常用基本语句pandas必知必会

python的4个内建的数据结构:
列表List [1,2,3]
元组tuple (1,2,3)
字典dictionary {‘data’:1,‘data2’:2}
集合set{1,2,2,3} 或者set([1,2,2,3])# 集合是会自动去重为{1,2,3}的

列表和元组可以用到的函数:
cmp(a,b)比较,len(a),max(a),min(a),sum(a),sorted(a)
列表独有的函数:a.append(199),a.count(1)
a.extend([1,2]) 将列表[1,2]追加到列表a末尾
a.index(1)找出第一个1的索引
a.insert(2,1)将1插入到列表a索引为2的位置
a.pop(188)删除列表a中索引为188的数据

字典的处理:
dict([[‘data’,1],[‘data2’,2]])相当于 {‘data’:1,‘data2’:2}

集合的处理:
a|b 并集,&交集,-求差,^对称差集

python中函数式编程的常见函数:(更快)
lambda(),map(),reduce(),filter()

map()命令等同于效率更高的for命令
a=[1,2,3]
b=map(lambda x:x+2,a)
b= list(b)
#结果为[3,4,5]

for的写法是 b=[i+2 for i in a ]

lilter()函数,筛选过滤符合条件的元素
b= filter (labmda x:x>5 and x<8,range(10))
b=list(b)

[6,7]

python的拓展库
numpy:数组
scipy:矩阵(依赖于numpy)
matplotlib:可视化
pandas:数据分析工具
statsmodels:统计
scikit-learn :机器学习库
keras:深度学习
gensim:文本学习

numpy的基本操作:
#-- coding:utf-8 -
import numpy as np
a=np.array([2,0,1,5])
print(a[:3])# 切片 引用前3个数据

matplotlib作图
x = np.linspace(0, 10, 1000)
y = np.sin(x) + 1
z = np.cos(x**2) + 1
plt.figure(figsize=(8, 4))
plt.plot(x, y, label=‘sin x +1’, color=‘red’, linewidth=2)

lable 和 label 大大不同

plt.plot(x, z, ‘b–’, label=‘cos x^2 +1’)
plt.xlabel(‘times(s)’)
plt.ylabel(‘volt’)
plt.title(‘thousand’)
plt.ylim(0, 2.2)
plt.legend()
plt.show()

excel的读取

pip install xlrd #读取
pip install xlwt # 写入

pandas的基本数据结构:Series(一维数据)、DataFrame(二维数组)

常见的读表:
pd.read_excel(‘data.xls’,index_col=u’日期’)# 取中文列名
pd.read_csv(‘data.csv’,encoding=‘utf-8’)

from statsmodels.tsa.stattools import adfuller as ADF
ADF(np.random.rand(100))#返回ADF值 P值

sklearn 的常用代码
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit()
model.predict(X_new)
model.predict_proba(X_new)# LR使用
model.score()#得分越高fit越好

额外的知识
model.transform()从数据中学到新的基空间
model.fit_transform()学习到基空间并转换

#-- coding: utf-8 --
import pandas as pd
catering_sale = ‘C:/Users/thous/Desktop/python_new/chapter3/demo/data/catering_sale.xls’ #餐饮数据

data = pd.read_excel(catering_sale, index_col = u’日期’) #读取数据,指定“日期”列为索引列

import matplotlib.pyplot as plt #导入图像库
plt.rcParams[‘font.sans-serif’] = [‘SimHei’] #用来正常显示中文标签
plt.rcParams[‘axes.unicode_minus’] = False #用来正常显示负号

import numpy as np
import pandas as pd

n_sample = 1000

df_score = pd.DataFrame({
‘user_id’: [u for u in range(n_sample)],
‘label’:np.random.randint(2, size=n_sample),
‘score’: 900*np.random.random(size=n_sample),
‘term’: 20201+np.random.randint(5, size=n_sample)
})

df_score.groupby(‘term’).agg(total=(‘label’, ‘count’),
bad=(‘label’, ‘sum’),
bad_rate=(‘label’, ‘mean’))

#KS,GINI,AUC

from sklearn.metrics import roc_auc_score, roc_curve

def get_auc(ytrue, yprob):
auc = roc_auc_score(ytrue, yprob)
if auc < 0.5:
auc = 1 - auc
return auc

def get_ks(ytrue, yprob):
fpr, tpr, thr = roc_curve(ytrue, yprob)
ks = max(abs(tpr - fpr))
return ks

def get_gini(ytrue, yprob):
auc = get_auc(ytrue, yprob)
gini = 2 * auc - 1
return gini

df_metrics = pd.DataFrame({
‘auc’: df_score.groupby(‘term’).apply(lambda x: get_auc(x[‘label’], x[‘score’])),
‘ks’: df_score.groupby(‘term’).apply(lambda x: get_ks(x[‘label’], x[‘score’])),
‘gini’: df_score.groupby(‘term’).apply(lambda x: get_gini(x[‘label’], x[‘score’]))
})

#PSI

df_score[‘score_bin’] = pd.cut(df_score[‘score’], [0, 500, 700, 800, 900])

df_total = pd.pivot_table(df_score,
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_ratio = df_total.div(df_total.iloc[-1, :], axis=1)

eps = np.finfo(np.float32).eps
lst_psi = list()
for idx in range(1, len(df_ratio.columns)-1):
last, cur = df_ratio.iloc[0, -1: idx-1]+eps, df_ratio.iloc[0, -1: idx]+eps
psi = sum((cur-last) * np.log(cur / last))
lst_psi.append(psi)
df_ratio.append(pd.Series([np.nan]+lst_psi+[np.nan],
index=df_ratio.columns,
name=‘psi’))

#总人数比例和坏客户比例

df_total = pd.pivot_table(df_score,
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_ratio = df_total.div(df_total.iloc[-1, :], axis=1)

df_bad = pd.pivot_table(df_score[df_score[‘label’]==1],
values=‘user_id’,
index=‘score_bin’,
columns=[‘term’],
aggfunc=“count”,
margins=True)
df_bad_rate = df_bad/df_total

#做图

import seaborn as sns

colormap = sns.diverging_palette(130, 20, as_cmap=True)
df_ratio.drop(‘All’).T.plot(kind=‘bar’, stacked=True, colormap=colormap)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

colormap = sns.diverging_palette(130, 20, as_cmap=True)
df_bad_rate.drop(‘All’).T.plot(kind=‘line’, colormap=colormap)
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

Pandas提供了pivot_table函数来进行数据透视表分析。下面是pivot_table函数的基本语法:

pivot_table(data, values=None, index=None, columns=None, aggfunc=‘mean’, fill_value=None, margins=False, dropna=True, margins_name=‘All’)
下面我们将介绍一些常用参数的含义:

data:要进行数据透视表分析的数据集。
values:要计算的值的字段名。
index:用于分组的字段名。
columns:用于分列的字段名。
aggfunc:用于计算值的函数,默认为’mean’。
fill_value:用于填充缺失值的值。
margins:是否添加汇总行和列。
dropna:是否删除包含缺失值的行或列。
margins_name:汇总行和列的名称。

Pandas提供了plot函数来进行数据可视化。下面是plot函数的基本语法:

plot(kind=‘line’, ax=None, subplots=False, sharex=None, sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, secondary_y=False, sort_columns=False, **kwds)
下面我们将介绍一些常用参数的含义:

kind:图表类型,如’line’、‘bar’、'barh’等。
ax:要绘制图表的坐标轴。
subplots:是否将每个列绘制为单独的子图。
sharex:是否共享x轴。
sharey:是否共享y轴。
layout:子图布局。
figsize:图表尺寸。
use_index:是否使用索引作为x轴。
title:图表标题。
grid:是否显示网格线。
legend:是否显示图例。
style:图表样式。
logx:是否使用对数刻度x轴。
logy:是否使用对数刻度y轴。
loglog:是否使用对数刻度x轴和y轴。
xticks:x轴刻度。
yticks:y轴刻度。
xlim:x轴范围。
ylim:y轴范围。
rot:x轴标签旋转角度。
fontsize:字体大小。
colormap:颜色映射。
table:是否绘制表格。
yerr:y轴误差。
xerr:x轴误差。
secondary_y:是否绘制第二个y轴。
sort_columns:是否按列名排序。

使用Pandas导入数据并读取文件
要使用pandas导入数据和读取文件,我们可以使用库提供的read_*函数。

导入Pandas

import pandas as pd

使用Pandas读取文件

读取CSV文件

df = pd.read_csv(‘file.csv’)

读取Excel文件

df = pd.read_excel(‘file.xlsx’)

读取JSON文件

df = pd.read_json(‘file.json’)

读取Sql查询

pd.read_sql(query, connection_object)

读取Parquet文件

df = pd.read_parquet(‘file.parquet’)

从url读取HTML表

url=‘https://www.example.com/table.html’
tables = pd.read_html(url)

Pandas提供了各种数据选择方法,允许你从DataFrame或Series中提取特定数据。

用于获取带有标签列的series

df[column]

选择多列

df[[‘column_name1’, ‘column_name2’]]

通过标签选择单行

df.loc[label]

通过标签选择多行

df.loc[[label1, label2, label3]]

通过整数索引选择单行

df.iloc[index]

通过整数索引选择多行

df.iloc[start_index:end_index]

根据条件过滤行

df[df[‘column_name’] > 5 ]

使用多个条件过滤行

df[(df[‘column_name1’] > 5) & (df[‘column_name2’] == ‘value’)]

通过标签选择特定的行和列

df.loc[row_labels, column_labels]

通过整数索引选择特定的行和列

df.iloc[row_indices, column_indices]

根据条件选择数据框中的行和列

df.loc[df[‘column_name’] > 5, [‘column_name1’, ‘column_name2’]]

数据清洗是数据预处理阶段的重要步骤,在此阶段对数据进行转换和修改以确保其准确性、一致性和可靠性。

检查缺失值

df.isnull()

删除有缺失值的行

df.dropna()

用特定值填充缺失值

df.fillna(value)

插入缺失值

df.interpolate()

检查重复行

df.duplicated()

删除重复行

df.drop_duplicates()

计算z分数

z_scores = (df - df.mean()) / df.std()

根据z分数识别离群值

= df[z_scores > threshold]

删除离群值

df_cleaned = df[z_scores <= threshold]

替换列中的值

df[‘column_name’] = df[‘column_name’].str.replace(‘old_value’, ‘new_value’)

删除前/尾空格

df[‘column_name’] = df[‘column_name’].str.strip()

将字符串转换为小写

df[‘column_name’] = df[‘column_name’].str.lower()

将列转换为不同的数据类型

df[‘column_name’] = df[‘column_name’].astype(‘new_type’)

将列转换为日期时间

df[‘date_column’] = pd.to_datetime(df[‘date_column’])

重命名列名

df.columns = [‘Cat’, ‘Mat’, ‘Xat’]

重置DataFrame的索引

df.reset_index()

根据条件过滤行

df_filtered = df[df[‘column_name’] > 5]

按单列对DataFrame进行排序

df_sorted = df.sort_values(‘column_name’)

按多列对DataFrame进行排序

df_sorted = df.sort_values([‘column_name1’, ‘column_name2’], ascending=[True, False])

按单列对DataFrame进行分组并计算另一列的平均值

grouped_data = df.groupby(‘column_name’)[‘other_column’].mean()

按多列对DataFrame进行分组并计算另一列的总和

grouped_data = df.groupby([‘column_name1’, ‘column_name2’])[‘other_column’].sum()

计算列的总和

sum_value = df[‘column_name’].sum ()

计算列的平均值

mean_value = df[‘column_name’].mean()

计算列的最大值

max_value = df[‘column_name’].max()

计算列的最小值

min_value = df[ ‘column_name’ ].min()

统计列中非空值的个数

count = df[‘column_name’].count()

对DataFrame进行分组并重置索引

grouped_data = df.groupby(‘column_name’)[‘other_column’].sum().reset_index()

在pandas中,你可以使用各种函数基于公共列或索引来连接或组合多个DataFrame。

将df中的行添加到df2的末尾

df.append(df2)

将df中的列添加到df2的末尾

pd.concat([df, df2])

对列A执行外连接

outer_join = pd.merge(df1, df2, on=‘A’, how=‘outer’), axis =1)

对列A执行内连接

inner_join = pd.merge(df1, df2, on=‘A’, how=‘inner’)

对列A执行左连接

left_join = pd.merge(df1, df2, on=‘A’, how=‘left’)

对列A执行右连接

right_join = pd.merge(df1, df2, on=‘A’, how=‘right’)
Pandas提供了广泛的统计函数和方法来分析DataFrame或Series中的数据。

计算数值列的描述性统计

df.describe()

计算某列的总和

df[‘column_name’].sum()

计算某列的平均值

df[‘column_name’].mean()

计算某列的最大值

df[‘column_name’].max()

计算某列中非空值的数量

df[‘column_name’].count()

计算列中某个值的出现次数

df[‘column_name’].value_counts()

以csv格式导出, 不带行索引导出

df.to_csv(‘filename.csv’, index=False)

以Excel格式导出, 不带行索引导出

data.to_excel(‘filename.xlsx’, index=False)

导出Json格式

data.to_json(‘filename.json’, orient=‘records’)

以SQL格式导出

data.to_sql(‘table_name’, con=engine, if_exists=‘replace’, index=False)

从数据库导入数据

import sqlite3
conn = sqlite3.connect(‘database.db’)
query = ‘SELECT * FROM table_name’
df_db = pd.read_sql(query, conn)

将数据保存到数据库

import sqlite3
conn = sqlite3.connect(‘database.db’)
df.to_sql(‘table_name’, conn, if_exists=‘replace’, index=False)

数据清洗(去除空白字符)

df[‘column_name’] = df[‘column_name’].str.strip()

缺失值处理(删除包含缺失值的行)

df.dropna(inplace=True)

重复值处理(删除重复行)

df.drop_duplicates(inplace=True)

按列进行分组并计算平均值

grouped_df = df.groupby(‘column_name’).mean()

多列分组并计算总和

grouped_df = df.groupby([‘column1’, ‘column2’]).sum()

数据排序

sorted_data = df.sort_values(by=‘Age’, ascending=False)

添加新列

df[‘Gender’] = [‘Male’, ‘Female’, ‘Male’, ‘Female’, ‘Male’]

创建一个包含时间序列数据的DataFrame

data = pd.DataFrame({‘Date’: pd.date_range(start=‘2020-01-01’, periods=10),
‘Sales’: [100, 200, 150, 250, 180, 120, 300, 350, 400, 250]})

将日期列设置为索引

data.set_index(‘Date’, inplace=True)

计算每周销售总额

weekly_sales = data.resample(‘W’).sum()

打印每周销售总额

print(weekly_sales)

创建一个包含销售数据的DataFrame

data = pd.DataFrame({‘Year’: [‘2019’, ‘2019’, ‘2020’, ‘2020’],
‘Quarter’: [‘Q1’, ‘Q2’, ‘Q1’, ‘Q2’],
‘Product’: [‘A’, ‘B’, ‘A’, ‘B’],
‘Sales’: [100, 200, 150, 250]})

创建透视表

pivot_table = data.pivot_table(index=‘Year’, columns=‘Quarter’, values=‘Sales’, aggfunc=‘sum’)

打印透视表

print(pivot_table)

data = [[1,‘Bob’, 24, ‘American’, ‘high-school’],[2, ‘Nancy’, 23, ‘Australia’, ‘college’],[3, ‘Lili’, 22, ‘China’, ‘college’],[4, ‘Leo’, 27, ‘M78’, ‘university’],[5, ‘David’, 24, ‘moon’, ‘high-school’]]

df = pd.DataFrame(data, columns=[‘serial’, ‘name’, ‘age’, ‘from’, ‘grade’], index=[‘a’,‘b’,‘c’,‘d’,‘e’])

聚合,按grade分组,并计算分组后的平均年龄

xdf = df.groupby(‘grade’)[‘age’].mean()

删除一些列,让数据更简单些,再去做后面的操作

data = data.drop([“ma5”,“ma10”,“ma20”,“v_ma5”,“v_ma10”,“v_ma20”], axis=1)

推荐使用loc和iloc来获取的方式

data.loc[data.index[0:4], [‘open’, ‘close’, ‘high’, ‘low’]]
data.iloc[0:4, data.columns.get_indexer([‘open’, ‘close’, ‘high’, ‘low’])]

直接修改原来的值

data[‘close’] = 1 # 这一列都变成1

或者

data.close = 1

按照开盘价大小进行排序 , 使用ascending指定按照大小排序

data.sort_values(by=“open”, ascending=True).head()

按照多个键进行排序

data.sort_values(by=[‘open’, ‘high’])

data.query(“open<24 & open>23”).head()

可以指定值进行一个判断,从而进行筛选操作

data[data[“open”].isin([23.53, 23.85])]

stock_rise = data[‘p_change’]
stock_rise.cumsum()
axis=0:默认是列,axis=1为行进行运算
data[[‘open’, ‘close’]].apply(lambda x: x.max() - x.min(), axis=0)
data = pd.read_csv(“./data/stock_day.csv”, usecols=[‘open’, ‘close’])

json_read = pd.read_json(“./data/Sarcasm_Headlines_Dataset.json”, orient=“records”, lines=True)
json_read.to_json(“./data/test.json”, orient=‘records’)

qcut = pd.qcut(p_change, 10)

计算分到每个组数据个数

qcut.value_counts()

自己指定分组区间

bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
p_counts = pd.cut(p_change, bins)
p_counts.value_counts()

得出one-hot编码矩阵

dummies = pd.get_dummies(p_counts, prefix=“rise”)

按照行索引进行

pd.concat([data, dummies], axis=1)

默认内连接

result = pd.merge(left, right, on=[‘key1’, ‘key2’])

pro.plot(kind=‘bar’, stacked=True)
plt.show()

按color分组,再取出price1列求平均值

col.groupby([‘color’])[‘price1’].mean()

和上述一个功能

col[‘price1’].groupby(col[‘color’]).mean()

分组,数据的结构不变

col.groupby([‘color’], as_index=False)[‘price1’].mean()

按照国家分组,求出每个国家的星巴克零售店数量

count = starbucks.groupby([‘Country’]).count()
count[‘Brand’].plot(kind=‘bar’, figsize=(20, 8))
plt.show()

进行字符串分割

temp_list = [i.split(“,”) for i in df[“Genre”]]

获取电影的分类

genre_list = np.unique([i for j in temp_list for i in j])

增加新的列,创建全为0的dataframe

temp_df = pd.DataFrame(np.zeros([df.shape[0],genre_list.shape[0]]),columns=genre_list)

###学习进度 20(32/352)
python数据分析与挖掘实战

from pylab import mpl
mpl.rcParams[‘axes.unicode_minus’]=False
#显示中文
mpl.rcParams[‘font.sans-serif’]=[‘SimHei’]

pivot_table.plot(kind=‘line’, figsize=(10, 6), title=‘产品类别销售额趋势’)

#删除同名列,保留前面一项
df=df.loc[:,~df.columns.duplicated()]
df

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值