读取csv,excel,txt文件
pd.read_csv('my_csv.csv')
pd.read_table('my_txt.txt')
pd.read_excel('my_excel.excel')
参数
headers=None,表示第一行不作为列名
index_col,表示把某一列或几列作为索引
usecols,表示需要读哪几列
nrows,表示读取的数据行数
parse_dates,表示需要转化为时间的列
在读取 txt
文件时,经常遇到分隔符非空格的情况, read_table
有一个分割参数 sep
,它使得用户可以自定义分割符号,进行 txt
数据的读取。例如,下面的读取的表以 ||||
为分割:
使用 sep
,同时需要指定引擎为 python
pd.read_table('data/my_table_special_sep.txt',
sep=' \|\|\|\| ', engine='python')
注:read_table中,seq使用的是正则表达式,对字符进行转义
my_csv.to_csv('my_csv_saved.csv', index=False)
#to_csv可以保存为txt文件
my_excel.to_excel('data/my_excel_saved.xlsx', index=False)
pandas中具有两种基本的数据存储结构,存储一维 values 的 Series和存储二维 values 的 DataFrame
pd.Series(data = [100, 'a', {'dic1':5}],
index = pd.Index(['id1', 20, 'third'], name='my_idx'),
dtype = 'object',
name = 'my_name')
获取属性
s.values
s.index
s.dtype
s.name
s.shape
#单个索引值
s['id1']
data = [[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]]
df = pd.DataFrame(data = data,
index = ['row_%d'%i for i in range(3)], columns=['col_0', 'col_1', 'col_2'])
获取属性
df.values
df.index
df.dtype
df.name
df.shape
#单个索引值
df['col_0']
转置
df.T
#head返回前n行,默认是5
df.head(n)
#tail返回后n行,默认是5
df.tail(n)
#info返回信息概况
df.info()
#describe返回数值列对应的统计信息
df.describe()
sum, mean, median, var, std, max, min
#均值
df['特征名'].mean()
#最大值
df['特征名'].max()
quantile:分位数
count:缺失值个数
idxmax:最大值对应索引
df['特征名'].quantile(0.5)
df['特征名'].count()
df['特征名'].idmax()
注:以上函数的公共参数axis,默认为0逐列聚合,1为逐行聚合
unique:唯一值组成的列表
nunique:唯一值个数
value_counts:唯一值及对应频数
df['特征名'].unique()
df['特征名'].nunique()
df['特征名'].value_counts()
观察多个列组合的唯一值,使用drop_duplicates,参数keep
默认值 first
表示每个组合保留第一次出现的所在行, last
表示保留最后一次出现的所在行, False
表示把所有重复组合所在的行剔除
df.drop_duplicates(['特征名', '特征名'])
df.drop_duplicates(['特征名', '特征名'],keep='last')
replace函数:构造字典
df['gender'].replace({'Female':0, 'Male':1}).head()
df['Gender'].replace(['Female', 'Male'], [0, 1]).head()
逻辑替换
s.where(s<0, 100)
#默认参数 ascending=True 为升序
df.sort_values('特征').head()
#多列排序
df.sort_values(['Weight','Height'],ascending=[True,False]).head()
#索引排序:字符串的排列顺序由字母顺序决定
df_demo.sort_index(level=['Grade','Name'],ascending= [True,False]).head()
df.apply(my_mean)
def my_mean(x):
res=x.mean()
return res
df.apply(my_mean)
#axis控制行列输入
df.apply(lambda x:x.mean())
滑动窗口 rolling
、扩张窗口 expanding
以及指数加权窗口 ewm
s = pd.Series([1,2,3,4,5])
roller = s.rolling(window = 3)
#聚合运算
roller.mean()
roller.sum()
#滑动协方差运算/滑动协方差运算
s2 = pd.Series([1,2,6,16,30])
roller.cov(s2)
roller.corr(s2)
roller.apply(lambda x:x.mean())
shift, diff, pct_change
是一组类滑窗函数,它们的公共参数为 periods=n
,默认为1,分别表示取向前第 n
个元素的值、与向前第 n
个元素做差(与 Numpy
中不同,后者表示 n
阶差分)、与向前第 n
个元素相比计算增长率。这里的 n
可以为负,表示反方向的类似操作。
In [104]: s = pd.Series([1,3,6,10,15])
In [105]: s.shift(2)
Out[105]:
0 NaN
1 NaN
2 1.0
3 3.0
4 6.0
dtype: float64
In [106]: s.diff(3)
Out[106]:
0 NaN
1 NaN
2 NaN
3 9.0
4 12.0
dtype: float64
In [107]: s.pct_change()
Out[107]:
0 NaN
1 2.000000
2 1.000000
3 0.666667
4 0.500000
dtype: float64
In [108]: s.shift(-1)
Out[108]:
0 3.0
1 6.0
2 10.0
3 15.0
4 NaN
dtype: float64
In [109]: s.diff(-2)
Out[109]:
0 -5.0
1 -7.0
2 -9.0
3 NaN
4 NaN
dtype: float64
将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1
的 rolling
方法等价代替:
In [110]: s.rolling(3).apply(lambda x:list(x)[0]) # s.shift(2)
Out[110]:
0 NaN
1 NaN
2 1.0
3 3.0
4 6.0
dtype: float64
In [111]: s.rolling(4).apply(lambda x:list(x)[-1]-list(x)[0]) # s.diff(3)
Out[111]:
0 NaN
1 NaN
2 NaN
3 9.0
4 12.0
dtype: float64
In [112]: def my_pct(x):
.....: L = list(x)
.....: return L[-1]/L[0]-1
.....:
In [113]: s.rolling(2).apply(my_pct) # s.pct_change()
Out[113]:
0 NaN
1 2.000000
2 1.000000
3 0.666667
4 0.500000
dtype: float64
练一练
rolling
对象的默认窗口方向都是向前的,某些情况下用户需要向后的窗口,例如对1,2,3设定向后窗口为2的sum
操作,结果为3,5,NaN,此时应该如何实现向后的滑窗操作?
扩张窗口又称累计窗口,可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。具体地说,设序列为a1, a2, a3, a4,则其每个位置对应的窗口即[a1]、[a1, a2]、[a1, a2, a3]、[a1, a2, a3, a4]。
In [114]: s = pd.Series([1, 3, 6, 10])
In [115]: s.expanding().mean()
Out[115]:
0 1.000000
1 2.000000
2 3.333333
3 5.000000
dtype: float64
https://datawhalechina.github.io/joyful-pandas/build/html/