pandas 中有三种基本结构:
- Series
- DataFrame
- Panel
一维 Series 可以用一维列表初始化:
s = pd.Series([1,3,5,np.nan,6,8])
print(s)
输出:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
DataFrame 则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:
dates = pd.date_range('20130101', periods=6)
print(dates)
输出:
DatetimeIndex([‘2013-01-01’, ‘2013-01-02’, ‘2013-01-03’,
‘2013-01-04’,
‘2013-01-05’, ‘2013-01-06’],
dtype=‘datetime64[ns]’, freq=‘D’)
然后创建一个 DataFrame 结构:
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
默认情况下,如果不指定 index 参数和 columns,那么他们的值将用从 0 开始的数字替代。
除了向 DataFrame 中传入二维数组,我们也可以使用字典传入数据:
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
字典的每个 key 代表一列,其 value 可以是各种能够转化为 Series 的对象。
与 Series 要求所有的类型都一致不同,DataFrame 值要求每一列数据的格式相同。
head 和 tail 方法可以分别查看最前面几行和最后面几行的数据(默认为 5):
df.head()
df.tail(3)
下标使用 index 属性查看,列标使用 columns 属性查看,数据值使用 values 查看。
查看简单的统计数据:df.describe()
转置:df.T
sort_index(axis=0, ascending=True) 方法按照下标大小进行排序,axis=0 表示按第 0 维进行排序。
sort_values(by, axis=0, ascending=True) 方法按照 by 的值的大小进行排序,例如按照 B 列的大小:
df.sort_values(by="B")
虽然 DataFrame 支持 Python/Numpy 的索引语法,但是推荐使用 .at, .iat, .loc, .iloc 和 .ix 方法进行索引。
loc 可以方便的使用 label 进行索引,不过得到标量值可以用 at,速度更快;iloc 使用位置进行索引,当然,使用 iat 索引标量值更快。
所有 A 列大于 0 的行:
df[df.A > 0]
使用 isin 方法做 filter 过滤:
df2 = df.copy()
df2['E'] = ['one', 'one','two','three','four','three']
df2
df2[df2['E'].isin(['two','four'])]
丢弃所有缺失数据的行得到的新数据:
df1.dropna(how='any')
填充缺失数据:
df1.fillna(value=5)
检查缺失数据的位置:
pd.isnull(df1)
每一列的均值:df.mean()
每一行的均值:df.mean(1)
与 R 中的 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()
h = s.hist()
当 Series 或者 DataFrame 的某一列是字符串时,我们可以用 .str 对这个字符串数组进行字符串的基本操作:
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower()
连接
df = pd.DataFrame(np.random.randn(10, 4))
df
pieces = [df[:2], df[4:5], df[7:]]
pd.concat(pieces)
merge 可以实现数据库中的 join 操作:
left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
print(left)
print(right)
pd.merge(left, right, on='key')
将第三行的值添加到最后:
s = df.iloc[3]
df.append(s, ignore_index=True)
分类:
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
按照 A 的值进行分类:df.groupby('A').sum()
按照 A, B 的值进行分类:df.groupby(['A', 'B']).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')
分类
df = pd.DataFrame({"id":[1,2,3,4,5,6], "raw_grade":['a', 'b', 'b', 'a', 'a', 'e']})
df
#可以将 `grade` 变成类别:
df["grade"] = df["raw_grade"].astype("category")
df["grade"]
#将类别的表示转化为有意义的字符:
df["grade"].cat.categories = ["very good", "good", "very bad"]
df["grade"]
#添加缺失的类别:
df["grade"] = df["grade"].cat.set_categories(["very bad", "bad", "medium", "good", "very good"])
df["grade"]
#使用 grade 分组:
df.groupby("grade").size()
使用 ggplot 风格:plt.style.use('ggplot')
Series 绘图:
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))
p = ts.cumsum().plot()
DataFrame 按照 columns 绘图:
df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index,
columns=['A', 'B', 'C', 'D'])
df.cumsum().plot()
p = plt.legend(loc="best")