LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

LOFTER-网易轻博

pandas

1774浏览    31参与
CDA数据分析师
CDA数据分析师
Melody

Pandas练习(4)读取和写入excel表格时对日期格式的处理

最近使用pandas遇到一个问题,从excel读取日期时因为是datetime类型,所以会是“年月日时分秒”格式,此时须用.dt.strftime('%Y-%m-%d')去掉时分秒;但存入excel文档时因为是datetime类型,excel又自动加上了时分秒。解决方法是使用.apply(str)方法在存入excel前把datetime类型转换为string类型,再对string进行切片。.apply()方法对于要批量处理单元格内容十分有用。

pandas练习代码如下:

file_path = '/Users/Administrator/Desktop/'

file_name...

最近使用pandas遇到一个问题,从excel读取日期时因为是datetime类型,所以会是“年月日时分秒”格式,此时须用.dt.strftime('%Y-%m-%d')去掉时分秒;但存入excel文档时因为是datetime类型,excel又自动加上了时分秒。解决方法是使用.apply(str)方法在存入excel前把datetime类型转换为string类型,再对string进行切片。.apply()方法对于要批量处理单元格内容十分有用。

pandas练习代码如下:

file_path = '/Users/Administrator/Desktop/'

file_name = 'test.xls'

file = file_path + file_name

data = pd.read_excel(file,sheet_name = 'PLANNING',header=8)

#打开指定的excel文件中指定的表,并从指定的行开始

data.dropna(axis=0,how='all')

#删除所有空行

data.rename(columns={'PURCHASE ORDER DATE': '下单日期', 

                     'PURCHASE ORDER #': '合同号', 

                     'PURCHASE ORDER LINE #': '行号',

                     'PART NUMBER': '客户型号',

                     'QTY ORDERED': '订单数量',

                     'REQUESTED NEED DATE': '要求交货日期',

                     'CHINA PO NUMBER': '订单号',

                     'ETD - China Date': '预计发货日期',

                     'QTY Shipped': '已发货数量',

                     'Balance to Ship': '剩余数量',

                     'ETA Elgin Arrival Date': '预计到港日期',

                     'China Shipment #': '唛头',

                     'Qty Shipped': '备注1',

                     'QTY OPEN ON PO': '备注2',

                     'Ship Date': '发货日期',

                     'INVOICE NO.': '发票号码',

                     'OPEN OR CLOSED': '状态',

                     'Unnamed: 17': '备注3'

                     }                

                     , inplace=True) 

#强制替换所有列名称

data['下单日期']=data['下单日期'].dt.strftime('%Y-%m-%d')

#只保留日期格式的年月日

data['下单日期']=data['下单日期'].apply(str)

#将datetime类型转换为string类型

data['要求交货日期']=data['要求交货日期'].apply(str)

data['预计发货日期']=data['预计发货日期'].apply(str)

def request_date(x):

    return x[0:10]

#定义string切片方法

data['要求交货日期']=data['要求交货日期'].apply(request_date)

data['预计发货日期']=data['预计发货日期'].apply(request_date)


data.to_excel( '/Users/Administrator/Desktop/GKN_orders.xls',sheet_name='GKN',index=False)

#存入excel文档,指定文件名,指定表明,不输出索引


Melody

Pandas常用知识点

摘取自原文:https://www.cnblogs.com/WoLykos/p/9349581.html


1数据结构

  • Series:一维数组,与Numpy中的一维array类似。

  • Time- Series:以时间为索引的Series。

  • DataFrame:二维的表格型数据结构。可以将DataFrame理解为Series的容器。

  • Panel :三维的数组,可以理解为DataFrame的容器。

# 导入别名import pandas as pdpd.Series([1,2,3,4])

2数据读取2.1 csv文件读取 

read_csv(filepath_or_buffer...

摘取自原文:https://www.cnblogs.com/WoLykos/p/9349581.html


1数据结构

  • Series:一维数组,与Numpy中的一维array类似。

  • Time- Series:以时间为索引的Series。

  • DataFrame:二维的表格型数据结构。可以将DataFrame理解为Series的容器。

  • Panel :三维的数组,可以理解为DataFrame的容器。

# 导入别名import pandas as pdpd.Series([1,2,3,4])

2数据读取2.1 csv文件读取 

read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)

  • filepath_or_buffer:文件路径,建议使用相对路径

  • header: 默认自动识别首行为列名(特征名),在数据没有列名的情况下 header = none, 还可以设置为其他行,例如 header = 5 表示索引位置为5的行作为起始列名

  • sep: 表示csv文件的分隔符,默认为','

  • names: 表示设置的字段名,默认为'infer'

  • index_col:表示作为索引的列,默认为0-行数的等差数列。

  • engine:表示解析引擎,可以为'c'或者'python'

  • encoding:表示文件的编码,默认为'utf-8'。

  • nrows:表示读取的行数,默认为全部读取

# 读取csv,参数可删 data = pd.read_csv('./data/test.csv',sep = ',',header = 'infer',names = range(5,18),index_col = [0,2],engine = 'python',encoding = 'gbk',nrows = 100)

# 读取csv,参数可删 data = pd.read_table('./data/test.csv',sep = ',',header = 'infer',names = range(5,18),index_col = [0,2],engine = 'python',encoding = 'gbk',nrows = 100)

2.2Excel 数据读取 

read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, thousands=None, convert_float=True, has_index_names=None, converters=None, dtype=None, true_values=None, false_values=None, engine=None, squeeze=False, **kwds)

  • io:文件路径+全称,无默认

  • sheetname:工作簿的名字,默认为0

  • header: 默认自动识别首行为列名(特征名),在数据没有列名的情况下 header = none, 还可以设置为其他行,例如 header = 5 表示索引位置为5的行作为起始列名

  • names: 表示设置的字段名,默认为'infer'

  • index_col:表示作为索引的列,默认为0-行数的等差数列

  • engine:表示解析引擎,可以为'c'或者'python'

data = pd.read_excel('./data/test.xls',sheetname='原始数据',header = 0,index_col = [5,6])

2.3数据库数据读取 

  1. read_sql_query(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, chunksize=None)

    • sql:表示抽取数据的SQL语句,例如'select * from 表名'

    • con:表示数据库连接的名称

    • index_col:表示作为索引的列,默认为0-行数的等差数列

  2. read_sql_table(table_name, con, schema=None, index_col=None, coerce_float=True, parse_dates=None, columns=None, chunksize=None)

    • table_name:表示抽取数据的表名

    • con:表示数据库连接的名称

    • index_col:表示作为索引的列,默认为0-行数的等差数列

    • columns:数据库数据读取后的列名。

  3. read_sql(sql, con, index_col=None, coerce_float=True, params=None, parse_dates=None, columns=None, chunksize=None)

  4. sql:表示抽取数据的表名或者抽取数据的SQL语句,例如'select * from 表名'

  5. con:表示数据库连接的名称

  6. index_col:表示作为索引的列,默认为0-行数的等差数列

  7. columns:数据库数据读取后的列名。

  建议:用前两个


# 读取数据库from sqlalchemy import create_engineconn = create_engine('mysql+pymysql://root:root@127.0.0.1/test?charset=utf8', encoding='utf-8', echo=True)# data1 = pd.read_sql_query('select * from data', con=conn)# print(data1.head())data2 = pd.read_sql_table('data', con=conn)print(data2.tail())print(data2['X'][1]) 

   数据库连接字符串各参数说明 

  'mysql+pymysql://root:root@127.0.0.1/test?charset=utf8'

  连接器://用户名:密码@数据库所在IP/访问的数据库名称?字符集

3数据写出3.1将数据写出为csv

DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='"', line_terminator='\n', chunksize=None, tupleize_cols=False, date_format=None, doublequote=True, escapechar=None, decimal='.')

  • path_or_buf:数据存储路径,含文件全名例如'./data.csv'

  • sep:表示数据存储时使用的分隔符

  • header:是否导出列名,True导出,False不导出

  • index: 是否导出索引,True导出,False不导出

  • mode:数据导出模式,'w'为写

  • encoding:数据导出的编码

import pandas as pddata.to_csv('data.csv',index = False)

3.2将数据写出为excel

DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)

  • excel_writer:数据存储路径,含文件全名例如'./data.xlsx'

  • sheet_name:表示数据存储的工作簿名称

  • header:是否导出列名,True导出,False不导出

  • index: 是否导出索引,True导出,False不导出

  • encoding:数据导出的编码

data.to_excel('data.xlsx',index=False)

3.3将数据写入数据库 

DataFrame.to_sql(name, con, flavor=None, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None)

  • name:数据存储表名

  • con:表示数据连接

  • if_exists:判断是否已经存在该表,'fail'表示存在就报错;'replace'表示存在就覆盖;'append'表示在尾部追加

  • index: 是否导出索引,True导出,False不导出

from sqlalchemy import create_engineconn =create_engine('mysql+pymysql://root:root@127.0.0.1/data?charset=utf8', encoding='utf-8', echo=True)data.to_sql('data',con = conn)

4数据处理4.1数据查看 


# 查看前5行,5为数目,不是索引,默认为5data.head()# 查看最后6行,6为数目,不是索引,默认为5 data.tail(6)# 查看数据的形状data.shape# 查看数据的列数,0为行1位列 data.shape[1]# 查看所有的列名data.columns# 查看索引data.index# 查看每一列数据的类型data.dtypes# 查看数据的维度 data.ndim


## 查看数据基本情况data.describe()'''count:非空值的数目mean:数值型数据的均值std:数值型数据的标准差min:数值型数据的最小值25%:数值型数据的下四分位数50%:数值型数据的中位数75%:数值型数据的上四分位数max:数值型数据的最大值''' 


4.2数据索引 


# 取出单独某一列 X = data['X']# 取出多列 XY = data[['X','Y']]# 取出某列的某一行 data['X'][1]# 取出某列的某几行 data['X'][:10]# 取出某几列的某几行 data[['X','Y']][:10] 
# loc方法索引'''DataFrame.loc[行名,列名]'''# 取出某几列的某一行 data.loc[1,['X','月份']]# 取出某几列的某几行(连续) data.loc[1:5,['X','月份']]# 取出某几列的某几行(连续) data.loc[[1,3,5],['X','月份']]# 取出 x ,FFMC ,DC的0-20行所有索引名称为偶数的数据 data.loc[range(0,21,2),['X','FFMC','DC']] 
# iloc方法索引'''DataFrame.iloc[行位置,列位置]'''# 取出某几列的某一行 data.iloc[1,[1,4]]# 取出列位置为偶数,行位置为0-20的偶数的数据 data.iloc[0:21:2,0:data.shape[1]:2] 
# ix方法索引'''DataFrame.ix[行位置/行名,列位置/列名]'''## 取出某几列的某一行 data.ix[1:4,[1,4]]data.ix[1:4,1:4] 


loc,iloc,ix的区别 

  1. loc使用名称索引,闭区间

  2. iloc使用位置索引,前闭后开区间

  3. ix使用名称或位置索引,且优先识别名称,其区间根据名称/位置来改变

  综合上述所言,不建议使用ix,容易发生混淆的情况,并且运行效率低于loc和iloc,pandas考虑在后期会移除这一索引方法

4.3数据修改 


# 修改列名 list1 = list(data.columns)list1[0] = '第一列'data.columns = list1data['新增列'] = Truedata.loc['新增一行',:] = Truedata.drop('新增列',axis=1,inplace=True)data.drop('新增一行',axis=0,inplace=True) 

import pandas as pddata = pd.read_excel('./data/test.xls')# 时间类型数据转换 data['发生时间'] = pd.to_datetime(data['发生时间'],format='%Y%m%d%H%M%S')# 提取day data.loc[1,'发生时间'].day# 提取日期信息新建一列 data['日期'] = [i.day for i in data['发生时间']]year_data = [i.is_leap_year for i in data['发生时间']] 


4.4分组聚合4.4.1分组 

  


# 分组 group1 = data.groupby('性别')group2 = data.groupby(['入职时间','性别'])# 查看有多少组 group1.size() 


 笔记: 

  用groupby方法分组后的结果并不能直接查看,而是被存在内存中,输出的是内存地址。实际上分组后的数据对 象GroupBy类似Series与DataFrame,是pandas提供的一种对象。 

4.4.2Groupby对象常见方法 


4.4.3Grouped对象的agg方法 

  Grouped.agg(函数或包含了字段名和函数的字典)


# 第一种情况 group[['年龄','工资']].agg(min)# 对不同的列进行不同的聚合操作 group.agg({'年龄':max,'工资':sum})# 上述过程中使用的函数均为系统math库所带的函数,若需要使用pandas的函数则需要做如下操作 group.agg({'年龄':lambda x:x.max(),'工资':lambda x:x.sum()}) 

4.4.4Grouped对象的apply聚合方法 

  Grouped.apply(函数操作)

  只能对所有列执行同一种操作

group.apply(lambda x:x.max())

4.4.5Grouped对象的transform方法 

  grouped.transform(函数操作)

  transform操作时的对象不再是每一组,而是每一个元素

# 每一空添加字符 group['年龄'].transform(lambda x: x.astype(str)+'岁').head()# 组内标准化 group1['工资'].transform(lambda x:(x.mean()-x.min())/(x.max()-x.min())).head()


Melody

Pandas练习(3)多级索引、groupby()方法练习

import pandas as pd

"""多级索引、groupby()方法中sum()、mean()、count()练习"""

date = ["3月1日", "3月1日", "3月1日", "3月2日", "3月2日", "3月2日", "3月3日", "3...
import pandas as pd

"""多级索引、groupby()方法中sum()、mean()、count()练习"""

date = ["3月1日", "3月1日", "3月1日", "3月2日", "3月2日", "3月2日", "3月3日", "3月3日", "3月3日"]
name = ["王", "李", "赵", "王", "李", "赵", "王", "李", "赵"]
sold = [1000,1500,800,200, 500,1000,700, 500,900]
data = list(zip(date, name))
my_index = pd.MultiIndex.from_tuples(data)  # 生成多级索引

df = pd.DataFrame(sold, index=my_index ,columns=["销售额"])
sum_d = df.groupby(date).sum()  # 计算每日总销售额
sum_p = df.groupby(name).sum()  # 计算每人总销售额
avg = df.groupby(date).mean()  # 每日每个销售员平均销售额
n = df.groupby(date).count()  # 统计有效值(非空值)数量

print(df)
print(sum_d)
print(sum_p)
print(avg)
print(n)


显示结果:

         销售额

3月1日 王  1000

     李  1500

     赵   800

3月2日 王   200

     李   500

     赵  1000

3月3日 王   700

     李   500

     赵   900

       销售额

3月1日  3300

3月2日  1700

3月3日  2100

    销售额

李  2500

王  1900

赵  2700

              销售额

3月1日  1100.000000

3月2日   566.666667

3月3日   700.000000

      销售额

3月1日    3

3月2日    3

3月3日    3




Melody

Pandas练习(2)二维数据结构练习

方法一:用pandas.Series集合构建DataFrame

import pandas as pd

"""2维数据结构练习"""

df ={
'name': pd.Series(["monica","jessica","laura"],index=[1,2,3]),
'age': pd.Series(["18","19","20"],[1,2,3]),
'nationality': pd.Series(["...

方法一:用pandas.Series集合构建DataFrame

import pandas as pd

"""2维数据结构练习"""

df ={
'name': pd.Series(["monica","jessica","laura"],index=[1,2,3]),
'age': pd.Series(["18","19","20"],[1,2,3]),
'nationality': pd.Series(["chinese", "american", 'japanese'],[1,2,3])
}

data = pd.DataFrame(df)
print(data)



方法二:用字典创建DataFrame

import pandas as pd


data ={
'name': ["monica","jessica","laura"],
'age': ["18","19","20"],
'nationality':["chinese","american","japanese"]
    }

df = pd.DataFrame(data, index=[1,2,3])



显示结果:

      name age nationality

1   monica  18     chinese

2  jessica  19    american

3    laura  20    japanese



CDA数据分析师
CDA数据分析师
CDA数据分析师
CDA数据分析师
CDA数据分析师
CDA数据分析师
pandas点滴

读取csv格式错误,UnicodeDecodeError: 'utf-8' codec can't

solution

(encoding = "ISO-8859-1")

文件格式对我还是一个谜,文件也是个谜

solution

(encoding = "ISO-8859-1")

文件格式对我还是一个谜,文件也是个谜

pandas点滴

I HATE IT

I HATE it when I am desperately lost in pandas API documents. So helpless, so ANGRY.


groupby()


I HATE it when I am desperately lost in pandas API documents. So helpless, so ANGRY.


groupby()

 

pandas点滴

用复合条件作列检索要加括号并用bit logic operators

https://stackoverflow.com/questions/37330880/pandas-index-rows-by-an-or-condition

loc[criteria, [list of feature names]]

https://stackoverflow.com/questions/37330880/pandas-index-rows-by-an-or-condition

loc[criteria, [list of feature names]]

pandas点滴

pandas列统计

列总数:

df. count()

df.name.unique()

选则DataFrame对象的一列  df.col_name


频次统计:

df.name.value_counts()

更多


列总数:

df. count()

df.name.unique()

选则DataFrame对象的一列  df.col_name


频次统计:

df.name.value_counts()

更多


pandas点滴

DataFrame.describe()

API Ref

DataFrame.describe(percentiles=None, include=None, exclude=None)

  • percentiles项:分位数 默认三个分位数都有,中位数必有,其他两个可用列表配置[.25,.5,.75]

  • include:默认包含所有数值列,不含object列,比如string,需要单独加入include = ['O']。Describing a DataFrame. By default only numeric fields are returned.   ...

API Ref

DataFrame.describe(percentiles=None, include=None, exclude=None)

  • percentiles项:分位数 默认三个分位数都有,中位数必有,其他两个可用列表配置[.25,.5,.75]

  • include:默认包含所有数值列,不含object列,比如string,需要单独加入include = ['O']。Describing a DataFrame. By default only numeric fields are returned.   似乎pandas把数据类型分了3类:

  • exclude:默认都保留


std 样本标准差(越小表明数据越集中于均值或者期望,越大越分散)


pandas点滴

pandas.DataFrame

pandas.DataFrame

.columns  返回列标签索引

.index 返回行标签索引

pandas.Index: Immutable ndarray implementing an ordered, sliceable set. The basic object storing axis labels for all pandas objects

  • .values

  • .size

pandas.DataFrame

.columns  返回列标签索引

.index 返回行标签索引

pandas.Index: Immutable ndarray implementing an ordered, sliceable set. The basic object storing axis labels for all pandas objects

  • .values

  • .size

瓦特的water
compbio94

Pandas(data analysis)

作者:compbio94
powerful Python data analysis toolkit,pandas是一种实用的数据处理工具,提供大量的数据结构和函数处理数据。

我想找一份数据处理的实习,之前在中科院植物园做过一份类似的工作,但是由于当时没有学好,导致我大部分是使用Excel完成的,pandas提供三种数据结构,广播机制,对齐功能,唯一化功能为数据处理提供了大量的函数。

LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息