#构建数据
import pandas as pd
import numpy as np
#构建数据
dates = pd.date_range('20130101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
df2 = pd.DataFrame({'A': 1.,
'B': pd.Timestamp('20130102'),
'C': pd.Series(1, index=list(range(4)), dtype='float32'),
'D': np.array([3] * 4, dtype='int32'),
'E': pd.Categorical(["test", "train", "test", "train"]),
'F': 'foo'})
#查询数据字段格式
df2.dtypes
#数据显示前5行与显示最后3行
df.head()
df.tail(3)
#显示行列索引
df.index
df.columns
#显示数据的快速统计摘要
df.describe()
df.descirbe方法只能针对序列或数据框,一维数组是没有这个方法的。可以自定义一个函数,将这些统计描述指标全部汇总到一起:
def stats(x):
return pd.Series([x.count(),x.min(),x.idxmin(),x.quantile(.25),x.median(),x.quantile(.75),
x.mean(),x.max(),x.idxmax(),x.mad(),x.var(),x.std(),x.skew(),x.kurt()],
index = ['Count','Min','Whicn_Min','Q1','Median','Q3','Mean','Max',
'Which_Max','Mad','Var','Std','Skew','Kurt'])
print(stats(d1))
#行列转置
df.T
#数据按轴排序
df.sort_index(axis=1, ascending=False)
#按值排序
df.sort_values(by='B')
#选取数据的某列产生一个Series
df['A']
#对数据进行切片
df[0:3]
#通过标签获取数据.loc()
#要使用标签获取横截面,即选取行数据
df.loc[dates[0]]
#通过标签在多轴上选择,即选取列数据
df.loc[:, ['A', 'B']]
#显示标签切片,两个端点都包括在内,即选取制定行列数据
df.loc['20130102':'20130104', ['A', 'B']]
#减少返回对象的尺寸,即选取部分行列数据
df.loc['20130102', ['A', 'B']]
#为了获得标量值,即选取指定数据
df.loc[dates[0], 'A']
#为了快速访问标量(相当于先前的方法)
df.at[dates[0], 'A']
通过位置获取数据.iloc()
#通过传递的整数的位置进行选择
df.iloc[3]
#通过整数切片,其行为类似于numpy / python
df.iloc[3:5, 0:2]
#通过整数位置位置列表,类似于numpy / python样式:
df.iloc[[1, 2, 4], [0, 2]]
#对于显式切片行:
df.iloc[1:3, :]
#对于显式切片列:
df.iloc[:, 1:3]
#为了显式地获取值:
df.iloc[1, 1]
#为了快速访问标量(相当于先前的方法):
df.iat[1, 1]
布尔索引(通过条件判断获取数据)
#使用单列的值选择数据
df[df['A'] > 0]
#从满足布尔条件的DataFrame中选择值
df[df > 0]
#多条件筛选
df[(df['A']>0)&(df['C']>0)]
#使用isin()过滤方法:
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
df2
df2[df2['E'].isin(['two', 'four'])]
#设置新列将自动按索引对齐数据
s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20130102', periods=6))
df['F'] = s1
#通过标签设置值:
df.at[dates[0], 'A'] = 0
#按位置设置值:
df.iat[0, 1] = 0
#通过分配NumPy数组进行设置:
df.loc[:, 'D'] = np.array([5] * len(df))
#先前设置操作的结果
df
#where有设定的操作
df2 = df.copy()
df2[df2 > 0] = -df2
df2
#重新索引允许您更改/添加/删除指定轴上的索引。这将返回数据的副本
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[1], 'E'] = 1
df1
#确认是否存在缺失值
df1.isnull()
#删除任何缺少数据的行
df1.dropna(how='any')
#填充丢失的数据
1)用值填补所有缺失值
df1.fillna(value=5)
2)采用前项填充
df1.fillna(method='ffill')
3)采用后向填充
df1.fillna(method='bfill')
4)用均值填充
F_median=df1['F'].median()
E_mean=df1['E'].mean()
df1.fillna({'F':F_median,'E':E_mean})
#获取值所在的布尔掩码nan
pd.isna(df1)
np.random.seed(1234)
d1 = pd.Series(2*np.random.normal(size = 100)+3)
d2 = np.random.f(2,4,size = 100)
d3 = np.random.randint(1,100,size = 100)
print('非空元素计算: ', d1.count()) #非空元素计算
print('最小值: ', d1.min()) #最小值
print('最大值: ', d1.max()) #最大值
print('最小值的位置: ', d1.idxmin()) #最小值的位置,类似于R中的which.min函数
print('最大值的位置: ', d1.idxmax()) #最大值的位置,类似于R中的which.max函数
print('10%分位数: ', d1.quantile(0.1)) #10%分位数
print('求和: ', d1.sum()) #求和
print('均值: ', d1.mean()) #均值
print('中位数: ', d1.median()) #中位数
print('众数: ', d1.mode()) #众数
print('方差: ', d1.var()) #方差
print('标准差: ', d1.std()) #标准差
print('平均绝对偏差: ', d1.mad()) #平均绝对偏差
print('偏度: ', d1.skew()) #偏度
print('峰度: ', d1.kurt()) #峰度
print('描述性统计指标: ', d1.describe()) #一次性输出多个描述性统计指标
#统计列的均值
df.mean()
#统计行的均值
df.mean(1)
#对具有不同尺寸且需要对齐的对象进行操作。此外,pandas会自动沿指定尺寸拓展。
s = pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)
s
df.sub(s, axis='index')
apply()
#将函数应用于数据:
df.apply(np.cumsum)
df.apply(lambda x: x.max() - x.min())
#直方图化
s = pd.Series(np.random.randint(0, 7, size=10))
s
s.value_counts()
#Series在str 属性中配备了一组字符串处理方法,这些方法使您可以轻松地对数组的每个元素进行操作,如下面的代码片段所示。
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()
#CONCAT(合并):在连接/合并类型操作的情况下,pandas提供了各种功能,可以轻松地将Series和DataFrame对象与各种用于索引和关系代数功能的集合逻辑组合在一起。
df = pd.DataFrame(np.random.randn(10, 4))
df
pieces = [df[:3], df[3:7], df[7:]]
pd.concat(pieces)
#连接
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
pd.merge(left, right, on='key')
left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})
pd.merge(left, right, on='key')
#分组
“分组依据”是指涉及以下一个或多个步骤的过程:
a.拆分数据到基于某些标准组 b.将功能独立地应用于每个组 c.将结果合并为数据结构
df = pd.DataFrame({'A': ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)})
df
#分组,然后将sum()功能应用于结果组
df.groupby('A').sum()
#通过多列分组形成一个层次结构索引,我们可以再次应用该sum()功能。
df.groupby(['A', 'B']).sum()
#多层索引
tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two',
'one', 'two', 'one', 'two']]))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df2 = df[:4]
df2
#用stack()方法“压缩” DataFrame列中的级别
stacked = df2.stack()
stacked
#对于“堆叠的” DataFrame或系列(具有a MultiIndex作为 index),stack()is 的逆运算unstack()默认情况下会堆叠最后一级:
stacked.unstack()
stacked.unstack(1)
stacked.unstack(0)
在Excel中有一个非常强大的功能就是数据透视表,通过托拉拽的方式可以迅速的查看数据的聚合情况,这里的聚合可以是计数、求和、均值、标准差等。 pandas为我们提供了非常强大的函数pivot_table(),该函数就是实现数据透视表功能的。对于上面所说的一些聚合函数,可以通过参数aggfunc设定。
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:指定相应的聚合函数
fill_value:使用一个常数替代缺失值,默认不替换
margins:是否进行行或列的汇总,默认不汇总
dropna:默认所有观测为缺失的列
margins_name:默认行汇总或列汇总的名称为'All'
实例
df = pd.DataFrame({'A': ['one', 'one', 'two', 'three'] * 3,
'B': ['A', 'B', 'C'] * 4,
'C': ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,
'D': np.random.randn(12),
'E': np.random.randn(12)})
df
#一个数值,两个分组变量
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])
#两个数值,两个分组变量
pd.pivot_table(df, values=['D','E'], index=['A', 'B'], columns=['C'])
#结果进行非堆叠操作(unstack)
pd.pivot_table(df, values=['D','E'], index=['A', 'B'], columns=['C']).unstack()
#多个聚合函数
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'],aggfunc=[np.mean,np.median])
rng = pd.date_range('1/1/2012', periods=100, freq='S')
ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
ts.resample('5Min').sum()
#时区表示
rng = pd.date_range('3/6/2012 00:00', periods=5, freq='D')
ts = pd.Series(np.random.randn(len(rng)), rng)
ts
ts_utc = ts.tz_localize('UTC')
ts_utc
#转换到另一个时区:
ts_utc.tz_convert('US/Eastern')
#在时间跨度表示之间进行转换:
rng = pd.date_range('1/1/2012', periods=5, freq='M')
ts = pd.Series(np.random.randn(len(rng)), index=rng)
ts
ps = ts.to_period()
ps
ps.to_timestamp()
#在周期和时间戳之间转换可以使用一些方便的算术函数。在以下示例中,我们将以11月结束的年度的季度频率转换为季度结束后的月末的上午9点:
prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
ts = pd.Series(np.random.randn(len(prng)), prng)
ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
ts.head()
df = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6],
"raw_grade": ['a', 'b', 'b', 'a', 'a', 'e']})
#将原始成绩转换为分类数据类型
df["grade"] = df["raw_grade"].astype("category")
df["grade"]
#将类别重命名为更有意义的名称(分配 Series.cat.categories()
df["grade"].cat.categories = ["very good", "good", "very bad"]
#重新排序类别并同时添加缺少的类别(默认情况下,Series.cat()返回新方法下的方法Series)。
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium",
"good", "very good"])
df["grade"]
#排序是按类别中的顺序进行的,而不是词汇顺序
df.sort_values(by="grade")
#按类别列分组还显示空类别
df.groupby("grade").size()
import matplotlib.pyplot as plt
plt.close('all')
ts = pd.Series(np.random.randn(1000),
index=pd.date_range('1/1/2000', periods=1000))
ts = ts.cumsum()
ts.plot()
#在DataFrame上,该plot()方法很方便地绘制带有标签的所有列:
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
columns=['A', 'B', 'C', 'D'])
df = df.cumsum()
plt.figure()
df.plot()
#写入/读取csv文件
df.to_csv('foo.csv')
pd.read_csv('foo.csv')
#写入/读取HDF5
df.to_hdf('foo.h5', 'df')
pd.read_hdf('foo.h5', 'df')
#写入/读取Excel
df.to_excel('foo.xlsx', sheet_name='Sheet1')
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])
源文件:
链接:https://pan.baidu.com/s/1aCPdpkGDlWmjHr7LdSckMQ
提取码:6taq