pandas回顾
pandas回顾
文章目录
- pandas回顾
- 创建对象
- 基本功能
- 查看数据
- 排序
- 选择数据
- 数据计算
- 条件赋值
- 缺失值处理
- 统计操作。
- 合并与连接
- 重塑和数据透视表
- groupby
- 字符串
- tidy数据
- 效率和内存
- 因子
- 文件读写(excel)
- 其他
多年前开始使用pandas,后来用了一段时间的r语言,现在需要重新整理一下pandas的内容。
关于numpy可参考 NumPy中文文档
#引入模块
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
创建对象
#用列表建立一个Series对象
Series([1, 2, 3, np.NaN])
# 0 1.0
# 1 2.0
# 2 3.0
# 3 NaN
# dtype: float64#用字典直接定义一个df
DataFrame({"a":[1,2,3], "b":["yang", "jian", "shuai"]})
# a b
# 0 1 yang
# 1 2 jian
# 2 3 shuai# 利用矩阵,索引和列名建立一个df
dates = pd.date_range('20181114', periods=3)
df = pd.DataFrame(np.random.randn(3,4), index=dates, columns=list('ABCD'))
# A B C D
# 2018-11-14 1.263934 -1.550385 2.451117 1.319753
# 2018-11-15 -0.265367 -1.980790 1.241457 0.152994
# 2018-11-16 -1.444240 1.116383 0.873009 -2.334341
- 多重索引
#行和列都可以建立多重索引
cols = pd.MultiIndex.from_tuples([(x, y) for x in ['A', 'B', 'C'] for y in ['O', 'I']])
inde = pd.MultiIndex.from_tuples([(x, y) for x in ['x', 'y'] for y in ['n', 'm']])
df = pd.DataFrame(ndf.xs("m", level=1, axis=0)p.random.randn(4, 6), index=inde, columns=cols)
print(df)
# 可以用df.xs来选取数据,第一个参数为索引名称,axis=0表示行, level=0表示多重索引中最外层的索引
df.xs("m", level=1, axis=0)
df.xs('x', level=0, axis=0)
基本功能
- 布尔值
empty,any(), all()
df
# class name value m
# 0 True a 22.0 0
# 1 False a 33.0 0
# 2 True b 22.0 0
# 3 False c 10.0 0
# 4 True c 0.0 0
# 5 False c NaN 0
df.empty
#False
(df>0).any() #判断每一列是否存在大于0的元素
# class True
# name True
# value True
# m False
# dtype: bool
(df>0).all() #判断每一列所有元素是否都大于0
- 复制df
df2 = df #两个变量是指同一个数据框,修改其中一个,另一个会改变。
df3 = df.copy() #建立副本,返回新的对象,修改df3,df不受影响。
- astype()强制转换
得到的dataframe中,需要保证每一列中的数据类型是一致的。可以用这种方法转换。
#将class列中所有数据转换成bool值
df['class'] = df['class'].astype(np.bool)
- reindex()
reindex()重新索引,只是调整现有索引的顺序,不能重命名,这和rename()是有区别的,
reindex()可以对横轴和纵轴的标签进行选择和排序,但不能创建新的索引名称,否则显示NaN。
df = DataFrame({"a":[1,2,3], "b":["yang", "jian", "shuai"]})
df.reindex([2,1,0], axis = 'index') #也可以是axis = 'columns',即对列名进行重命名。为什么报错?
df.reindex(index = [2, 1, 0], columns= ["b", "a"])
# class name value m
# 5 False c NaN 0
# 5 False c NaN 0
# 4 True c 0.0 0
# 3 False c 10.0 0
# 2 True b 22.0 0
df.reindex(columns=['name', 'class', 'value'], index=[5, 5, 4, 3, 2, 9])
# name class value
# 5 c False NaN
# 5 c False NaN
# 4 c True 0.0
# 3 c False 10.0
# 2 b True 22.0
# 9 NaN NaN NaN
df.reindex(df2.index) #df2可以是df的子集,实现对df的筛选。
df.reindex_like(df2)# 让df的索引和df2的索引一致。
df.rename({""})
- 迭代
for col in df:print(col)print(type(col))
查看数据
- df.head(n) #返回前n行数据
- df.tail() #返回后n行数据
- df.columns #列信息。将列名放在列表中:list(df.columns)
- df.index #行索引
- df.values #返回一个表示df数据的numpy数组
- df.describe() #df的统计信息,包括各列的数量、分位点、平均值等
- df.T #转置数据,得到的也是一个DataFrame
- df.A.nlargest(n) 取A列最大的n个值 (最小:nsmallest(n))。或者df.nlargest(n, “A”),不过返回的是DataFrame。
- df.A.quantile([0.5])
# 查看df的列属性
df.dtypes
# A float64
# B float64
# C float64
# D float64
# dtype: object
df.describe()
# A B C D
# count 3.000000 3.000000 3.000000 3.000000
# mean -0.148558 -0.804931 1.521861 -0.287198
# std 1.357861 1.677765 0.825576 1.866394
# min -1.444240 -1.980790 0.873009 -2.334341
# 25% -0.854803 -1.765587 1.057233 -1.090674
# 50% -0.265367 -1.550385 1.241457 0.152994
# 75% 0.499284 -0.217001 1.846287 0.736374
# max 1.263934 1.116383 2.451117 1.319753
排序
(一般情况下,axis=1是对行操作,axis=0是对列操作。)
- 按索引名称排序,axis = 1对每一行数据排序,就是依据列名称排序。axis = 0 对每一列数据排序,依据行索引大小排序。
- 按某列的值排序。默认升序。
df.sort_index(axis=1, ascending=False)
# D C B A
# 2018-11-14 1.319753 2.451117 -1.550385 1.263934
# 2018-11-15 0.152994 1.241457 -1.980790 -0.265367
# 2018-11-16 -2.334341 0.873009 1.116383 -1.444240
df.sort_index(axis=0, ascending=False)
# A B C D
# 2018-11-16 -1.444240 1.116383 0.873009 -2.334341
# 2018-11-15 -0.265367 -1.980790 1.241457 0.152994
# 2018-11-14 1.263934 -1.550385 2.451117 1.319753
df.sort_values(by='B')
# A B C D
# 2018-11-15 -0.265367 -1.980790 1.241457 0.152994
# 2018-11-14 1.263934 -1.550385 2.451117 1.319753
# 2018-11-16 -1.444240 1.116383 0.873009 -2.334341
选择数据
- 选择行,返回第m到n-1行数据,dataframe。
#这里必须是切片操作,如果写成df[0], 会报错。
df[m:n]
- 选择列,返回Series
df["A"]
df.A
- df.loc[,]
第一个参数表示行索引名称,第二个参数表示列索引名称,两个参数都可以加中括号,返回的结果的维度不一样。
#两参数都有中括号,返回二维的数据框
type(df.loc[[dates[0]], ["A"]])
#pandas.core.frame.DataFrame
#返回Series
type(df.loc[dates[0], ["A"]])
# pandas.core.series.Series
#返回标量
type(df.loc[dates[0], "A"])
# numpy.float64df.loc['2018-11-14':'2018-11-15',['A','B']]
# A B
# 2018-11-14 1.263934 -1.550385
# 2018-11-15 -0.265367 -1.980790
- df.iloc[,]
按索引位置的序号来选择数据。
df.iloc[0] #选择第0行数据,Series
df.iloc[0:1, 0:2] #选择第0行,第0,1列数据。切片选择范围时不包括最后一个数字。
df.iloc[0, 0] #获取第0行、第0列的标量数据。
df.iloc[[0], [0]] #获取第0行、第0列的DataFrame数据框。
df.iloc[:, 0:2] #获取所有行、第0、1列
- 布尔索引
常用布尔结果对数据进行筛选。这里貌似只能筛选行。
df['A']>0
# 2018-11-14 True
# 2018-11-15 False
# 2018-11-16 False
# Freq: D, Name: A, dtype: bool
df[[True, False, False]] #只显示为True的行。
df[df['A']>0] #筛选A列大于0的行
df[(df['A']<0) & (df['B']>0)] #筛选A列小于0且B列大于0的行,需要括号包裹两个条件。
df[(df['A']<0) | (df['B']>0)] #筛选A列小于0或B列大于0的行,需要括号包裹两个条件。
df[(df['A']<0) ^ (df['B']>0)] #对称差集,在两集合中的并集中剔除交集的部分。
df[~(df['A']<0)] #补集
df2
# A B C D E
# 2018-11-14 1.263934 -1.550385 2.451117 1.319753 m
# 2018-11-15 -0.265367 -1.980790 1.241457 0.152994 n
# 2018-11-16 -1.444240 1.116383 0.873009 -2.334341 t
df2[df2['E'].isin(['m', 'n'])] #筛选E列中值在['m', 'n'] 范围内的数据。这里的isin()相当于R语言中的%in%.
# A B C D E
# 2018-11-14 1.263934 -1.550385 2.451117 1.319753 m
# 2018-11-15 -0.265367 -1.980790 1.241457 0.152994 n
- 新增及修改字段 assign(),类似R语言tideyverse包中的mutate()函数
# 修改df中的Value字段,并增加新列Value_2,返回新的数据框。这里的x是调用该方法的对象。
df = pd.DataFrame({'Color': 'Red Red Red Blue'.split(),'Value': [100, 150, 50, 50]})
df.assign(Value = lambda x:x.Value+1,Value_2 = lambda x:x.Value+2)
数据计算
包括统计学函数、窗口函数等。参考pandas官方文档
- 移动窗口操作 rolling()
df = pd.DataFrame({"a":range(9)})
df.a.rolling(3, center=False).sum() #这里以三条记录为一组,即某一行及前两行的记录;如果center=True,则取某行及前一行和后一行的记录。
df.a.rolling(2).mean()#移动平均
或者直接用df来调用
dates = pd.date_range('20181114', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df.rolling(2, center=True,on="A").sum()#默认是以index为观察目标的,如果用on="A",则指定观察目标为"A"列,即对移动A列。
- resample()
对于时间和日期索引的dataframe数据,用resample()函数可以选择不同时间间隔作为分组。
idx = pd.date_range('1/1/2019', periods=80, freq='d')
df3 = pd.DataFrame({"no":range(80), "b":range(1, 81,1)}, index=idx)
df4 = df3.drop(df3.index[[2,3]], axis = 0) #故意删掉两个日期索引2019-01-03, 2019-01-04,
df4
df4.resample('5d').sum()#统计每五天的数据之和,这里仍然是以1号到5号为一组进行求和,是以固定日期来分组,而不是日期索引的数量来分组。
df4.resample('5d').ohlc()#开始、结束、最高、最低
条件赋值
对符合某些条件的字段赋新值
#直接修改原df,注意等号左右两边的对象不一定一致,左边可以是dataframe,右边可以是常量。
df.loc['2018-11-14', "A"] = 0
#将df中大于0的数据变成负的。df[df>0]的返回结果中不符合条件的数据用NaN表示。
df[df>0] = -df
#先根据布尔条件筛选数据,然后再设置值
df.loc[df[df['A']<0].index, "A"] = 0
df.loc[df.A<0, ["A"]] = 0
#多个条件,这里用np.where()
df['A'] = np.where(df['A'] > 5, 'high', 'low')
缺失值处理
统计操作。
- 可以使用常见的统计函数。
df.count()
df.mean()等 - 也可以使用自定义函数。
apply()用于DataFrame中的列或行。
applymap()用于DataFrame中的每一个元素。
map()函数作用于一个Series的每一个元素,注意,mpa(f)中的参数f不但可以是函数,也可以Series的映射。
#将自定义函数应用于每一列,这里的x就是默认为列,也可以指定第二个参数为0。
df = pd.DataFrame({"A":[1,2,3,4], "B":[3,4,5,6]})
df.apply(lambda x: x.max() - x.min(), 0)
#第二个参数为1,将自定义函数应用于每一行。
df.apply(lambda x: x.max() - x.min(), 1)
df.applymap(lambda x:0)
df["A"].map(lambda x : 1)
# 这里的s是Series格式,可以作为一种函数映射关系
s = pd.Series({1:"a", 2:"b", 3:"c"})
df["A"].map(s)
合并与连接
- concat()
pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,
keys=None, levels=None, names=None, verify_integrity=False,
copy=True)
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],'B': ['B0', 'B1', 'B2', 'B3'],'C': ['C0', 'C1', 'C2', 'C3'],'D': ['D0', 'D1', 'D2', 'D3']},index=[0, 1, 2, 3])df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],'B': ['B4', 'B5', 'B6', 'B7'],'C': ['C4', 'C5', 'C6', 'C7'],'E': ['E4', 'E5', 'E6', 'E7']},index=[3, 5, 6, 7])
#将多个数据框放在一个列表中,默认按列操作,就是把数据框上下拼接在一起,可以存在相同的行索引。
pd.concat([df1, df2],keys=['x', 'y']) #选择所有的列,并添加外层索引['x','y']pd.concat([df1, df2], join='inner') #选择共同的列
# A B C
# 0 A0 B0 C0
# 1 A1 B1 C1
# 2 A2 B2 C2
# 3 A3 B3 C3
# 3 A4 B4 C4
# 5 A5 B5 C5
# 6 A6 B6 C6
# 7 A7 B7 C7
pd.concat([df1, df2], axis=1) #选择所有的行
# A B C D A B C E
# 0 A0 B0 C0 D0 NaN NaN NaN NaN
# 1 A1 B1 C1 D1 NaN NaN NaN NaN
# 2 A2 B2 C2 D2 NaN NaN NaN NaN
# 3 A3 B3 C3 D3 A4 B4 C4 E4
# 5 NaN NaN NaN NaN A5 B5 C5 E5
# 6 NaN NaN NaN NaN A6 B6 C6 E6
# 7 NaN NaN NaN NaN A7 B7 C7 E7
pd.concat([df1, df2], axis=1, join='inner') #选择共同的行
# A B C D A B C E
# 3 A3 B3 C3 D3 A4 B4 C4 E4
- merge()
pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(‘_x’, ‘_y’), copy=True, indicator=False,
validate=None)
类似于sql中连接操作。how参数指定连接方式, on、lef_on、right_on可以指定连接的索引名称。 - append()
你可以DataFrame通过传递一个Series或一个dict来 向a追加一行append,这将返回一个新的DataFrame。
s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D'])df1.append(s2, ignore_index=True)
# A B C D
# 0 A0 B0 C0 D0
# 1 A1 B1 C1 D1
# 2 A2 B2 C2 D2
# 3 A3 B3 C3 D3
# 4 X0 X1 X2 X3
- align()
df.align(df2, join='inner')
重塑和数据透视表
pivot() 类似于R语言tidyverse包中的spread(),就是把行转列。但是列转行用melt()
melt()
df.pivot(index=‘date’, columns=‘variable’, values=‘value’)
df
# name subject score
# 0 A Math 84
# 1 A English 89
# 2 A History 70
# 3 B Math 90
# 4 B English 84
# 5 B History 59
# 6 C Math 72
# 7 C English 62
# 8 C History 54df2 = df.pivot(index="name", columns='subject', values='score')
# subject English History Math
# name
# A 89 70 84
# B 84 59 90
# C 62 54 72
stack():针对多重索引
pivot_table() 类似于excel中的数据透视表,主要参数包括行,列,值,聚合函数。
pd.pivot_table(df, values=‘D’, index=[‘A’, ‘B’], columns=[‘C’], aggfunc=np.sum)
crosstab()交叉表,计算频数,对不同字段的取值进行分类统计。
df1
# A B C D
# 0 A0 B0 C0 D0
# 1 A1 B1 C1 D1
# 2 A2 B2 C2 D2
# 3 A3 B3 C3 D3
pd.crosstab(df1.A, df1.B) # 如果添加参数normalize=True,得到的是比例。
# B B0 B1 B2 B3
# A
# A0 1 0 0 0
# A1 0 1 0 0
# A2 0 0 1 0
# A3 0 0 0 1
pd.cut()将连续变量转换成离散变量。
groupby
可以根据列名分组,也可以根据不同级别索引来分组。
分组统计,直接调用聚合函数
df = DataFrame({"name":["a","a", "b", "c", "c", "c"], "class":[1, 0, 1, 0, 1, 0], "value":[22, 33, 22, 10, 0,np.NaN]})
# class name value
# 0 1 a 22.0
# 1 0 a 33.0
# 2 1 b 22.0
# 3 0 c 10.0
# 4 1 c 0.0
# 5 0 c NaN
# 只返回某个分组下的结果
a = df.groupby(["name"])
a.get_group("a")#对name分组并统计每一列的数量,不包括np.NaN
df.groupby(["name"]).count()
# class value
# name
# a 2 2
# b 1 1
# c 3 2#k只统计某一列,返回的是Series
df.groupby(["name"])['value'].count()
# name
# a 2
# b 1
# c 2
# Name: value, dtype: int64
#value_counts()也可以统计不同取值的数量。
df.name.value_counts()#取每个分组第0行。first(),last()等
df.groupby(["name"]).nth(0)
# class value
# name
# a 1 22.0
# b 1 22.0
# c 0 10.0#分组并筛选
df.groupby(["name"])['value'].filter(lambda x:x.sum()>20)
#也可以取最大值df.groupby(["name"])['value'].max()
# 0 22.0
# 1 33.0
# 2 22.0
# Name: value, dtype: float64# 对value字段进行多方面统计,注意聚合函数放在列表中。
df.groupby(["name"])['value'].agg([np.mean, np.sum, np.min, np.size])
# mean sum amin size
# name
# a 27.5 55.0 22.0 2.0
# b 22.0 22.0 22.0 1.0
# c 5.0 10.0 0.0 3.0#也可以对结果中列名重新定义。重命名,也可以对行索引进行重命名。
df.groupby(["name"])['value'].agg([np.mean, np.sum, np.min, np.size]).rename(columns={"mean":"me", "sum":"su", "amin":"am", "size":"si"})#分组后,对不同字段使用不同的函数
df.groupby(["name"]).agg({"class": lambda x: max(x) - min(x), "value": np.sum})
# 这种写法会提示废弃警告,可以写成下面这样:
#df.groupby(["name"]).agg(分类 = lambda x: max(x) - min(x), value = np.sum) 字段名可以用汉字,不用引号
# class value
# name
# a 1 55.0
# b 0 22.0
# c 1 10.0#使用get_group()获取某分组条件下的group,注意入参为元组。这里获取的是name为c,class为0的组。
df.groupby(["name", "class"]).get_group(('c', 0))
# class name value
# 3 0 c 10.0
# 5 0 c NaN#对分组进行迭代。
for name, group in df.groupby(["name"]):print(name)print(type(group))
# a
#
# b
#
# c
# #对每个分组内的记录进行单独标注行数
df.groupby(["name"]).cumcount()
# 0 0
# 1 1
# 2 0
# 3 0
# 4 1
# 5 2
# dtype: int64```python
## 时间序列
- 索引为日期格式
Timestamp: 表示单个时间戳 to_datetime, Timestamp
DatetimeIndex: Timestamp to_datetime,date_range,bdate_range,DatetimeIndex
Period: 表示单个时间跨度 Period
PeriodIndex: Period period_range, PeriodIndexpd.date_range('2018-11-15', periods=10, freq='D')# DatetimeIndex(['2018-11-15', '2018-11-16', '2018-11-17', '2018-11-18',# '2018-11-19', '2018-11-20', '2018-11-21', '2018-11-22',# '2018-11-23', '2018-11-24'],# dtype='datetime64[ns]', freq='D')
- dt
如果某一列是日期格式,则Series可以用dt分析。
import datetime
import pandas as pd
s = pd.Series(pd.date_range('2012-1-1', periods=5, freq='D'))
print(s)
print(s.max()-s)
s2 = s + datetime.timedelta( days = 1, hours = 1, minutes = 5, seconds = 59)
print(s2)
print(s2.dt.year)# 详细点:
df = DataFrame(pd.date_range('2018-11-15', periods=6, freq='D'), columns = ["date"])
# date
# 0 2018-11-15
# 1 2018-11-16
# 2 2018-11-17
# 3 2018-11-18
# 4 2018-11-19
# 5 2018-11-20
df['date'].dt.year
# 0 2018
# 1 2018
# 2 2018
# 3 2018
# 4 2018
# 5 2018
# Name: date, dtype: int64
df['date'][df['date'].dt.day > 18]
# 4 2018-11-19
# 5 2018-11-20
# Name: date, dtype: datetime64[ns]
字符串
Series和Index配备了一组字符串处理方法,可以轻松地对阵列的每个元素进行操作。也许最重要的是,这些方法会自动排除缺失/ NA值。这些是通过str属性访问的。
str属性是Series和Index具有的,不能用DataFrame直接调用,可以使用apply()
s = Series(["Alice B ", " d ef ", 'hello world', 'yang.j', 'jian.yang'])
# 0 Alice B
# 1 d ef
# 2 hello world
# 3 yang.j
# 4 jian.yang
# dtype: object
s.str.upper() #大写
s.str.lower() #小写
s.str.capitalize() #首字母大写
s.str.len() #长度
s.str.strip() #去掉首尾空格
s.str.lstrip()#去掉首部空格
s.str.rstrip()#去掉尾部空格
s.str.replace(" ", ".", regex=False) #把字符串中的空格替换成.符号,不使用正则。也可以支持正则及re.compile()对象。
s.str.split(' ') #根据空格分割
# 0 [Alice, B, ]
# 1 [, , d, ef, , ]
# 2 [hello, world]
# 3 [yang.j]
# 4 [jian.yang]
# dtype: object
s.str.get(0) #获取第0个字符
s.str.split(' ',expand=True, n=2) #这里的n是指只使用前n个分割符。
s.str.rsplit('_', expand=True, n=1) #反向分割
s.str[0]#获取第0个字符,和上面一样
# 0 A
# 1
# 2 h
# 3 y
# 4 j
# dtype: object
s.str.cat(sep='_')#用符号把所有字符串连接成一个字符串。
# 'Alice B _ d ef _hello world_yang.j_jian.yang'
s.str.cat(list('01234'), sep='_') #也可以和同样大小的列表拼接。这里也可以把df的两列拼在一起。
# 0 Alice B _0
# 1 d ef _1
# 2 hello world_2
# 3 yang.j_3
# 4 jian.yang_4
# dtype: object#该extract方法接受具有至少一个捕获组的正则表达式。
#但要注意,所有的正则表达式必须有一个或多个分组,也就是正则的引号内要有一组或多组括号。
s.str.extract(r'a') #这样写会报错。
s.str.extract(r'(a)') #这样写是正确的。
#正则中有两个分组,并用P来命名,对应结果中两列的列名。由于直接生成多列,有时比split()好用。
s.str.extract(r'(?P\w?)(?P\w+)' ,expand=True) #在未来的版本,expand=True返回DataFrame.
# col_1 col_2
# 0 A lice
# 1 d
# 2 h ello
# 3 y ang
# 4 j ian
s.str.extractall()#提取所有匹配内容。#匹配,返回True或False.
pattern = r'a'
s.str.contains(pattern) #支持正则,可以理解成包含,类似于re.search()。
# 0 False
# 1 False
# 2 False
# 3 True
# 4 True
# dtype: bool
s.str.match(pattern)#支持正则,类似于re.match(),从首字符开始匹配。
# 0 False
# 1 False
# 2 False
# 3 False
# 4 False
# dtype: bool
tidy数据
与R语言中的管道符号相似,pandas也有类似的使用方式。
比如以下示例中,每一步操作都用“点”符号连接,且是在上一步的返回结果上进行的。整个代码需要放在一个括号中,否则会报错。
df = pd.DataFrame({'Color': 'Red Red Red Blue'.split(),'Value': [100, 150, 50, 50]})
res = (df .rename(columns={"Color":"color"}) #修改字段名,返回新的数据框,这一步的返回结果已经不是df了。.assign(x = lambda x:x.color, #注意:这里的x是调用该方法的新数据框,不是df,所以用小写的colory = df.Color) #这里用的是原数据框df,所以字段名是大写的Color.sort_index().groupby(["color"]).agg("count").loc[:,["x", "y"]]#最后只选择新增的两个字段x,y
)
print(res)
效率和内存
- 可以使用cython、numba等方法,提升程序运行速度。
import numba
import numpy as np
import pandas as pd
@numba.jit
def abc(x):for i in range(10000):for j in range(100):for k in range(100):x = 0
%timeit abc(10) #jupyter中可以使用这个命令来计算运行时间。
- 节约存储空间:
如果某一字段是存量大量重复值的字符串,如性别、省份、学历等,可以把这一列转换成category类型时,pandas会用一种最省空间的int子类型去表示这一列中所有的唯一值,以节省存储空间。
data['a'] = data['a'] .astype('category')
另外,由于数值型数据有多种存储格式,如int8、int32等,函数pd.to_numeric()可以对数值型数据进行向下类型转换,以节省存储空间
因子
指分类数据 dtype=“category”,类似于R语言中的factor。
df[“B”] = df[“A”].astype(‘category’)。可以降低字符串数据占用的内存。
文件读写(excel)
- 生成和读取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。
excel_writer:写入的目标excel文件,可以是文件路径、ExcelWriter对象;
sheet_name:被写入的sheet名称,string类型,默认为'sheet1';
engine:也很重要,可以与openpyxl库对接。
na_rep:缺失值表示,string类型;
header:是否写表头信息,布尔或list of string类型,默认为True;
index:是否写行号,布尔类型,默认为True;
encoding:指定写入编码,string类型。
'''
import pandas as pd
writer = pd.ExcelWriter(path) #path为工作簿的路径和名称
data.to_excel(writer, 'sheet1') #sheet1为工作表的名称, data为DataFrame数据
writer.save()#保存数据的步骤不能少#读取
pd.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、header、names、encoding。io:excel文件,可以是文件路径、文件网址、file-like对象、xlrd workbook;sheetname:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型,返回字典{'key':'sheet'})、none(返回字典,全部sheet);header:指定数据表的表头,参数可以是int、list of ints,即为索引行数为表头;names:返回指定name的列,参数为array-like对象。encoding:关键字参数,指定以何种编码读取。该函数返回pandas中的DataFrame或dict of DataFrame对象,利用DataFrame的相关操作即可读取相应的数据。'''
data = pd.read_excel('excel文件的路径和名称')
print(data)
其他
找出出现次数最多的元素。
s = pd.Series([1, 1, 3, 3, 5, 5, 7, 7, 7])
s.mode()
pd.mode()
参考文档
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
