目录
pandas核心数据结构
Series
Series 是一维带标签的数组,数组里可以放任意的数据(整数,浮点数,字符串,Python Object)。其基本的创建函数是:
s = pd.Series(data, index=index)
其中 index 是一个列表,用来作为数据的标签;
data 可以是不同的数据类型:
- Python 字典
- ndarray 对象
- 一个标量值,如 5
从ndarray创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
运行结果为:
a 0.747292
b -1.120276
c -0.132692
d -0.267813
e -0.590904
从字典创建
# 空值的默认处理
d = {'a' : 0., 'b' : 1., 'd' : 3}
s = pd.Series(d, index=list('abcd'))
s
运行结果为:
a 0
b 1
c NaN
d 3
从标量创建
pd.Series(3, index=list('abcde'))
运行结果为:
a 3
b 3
c 3
d 3
e 3
Series 是类 ndarray 对象
s = pd.Series(np.random.randn(5))
可做如下操作:
s[0]
s[:3]
s[[1, 3, 4]]
np.exp(s)
np.sin(s)
Series 是类字典对象
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
可做如下操作:
s['a']
s['e'] = 5
s['g'] = 100
'e' in s
print s.get('f')
print s.get('f', np.nan) # 得到的空值返回为NaN
属性:标签对齐
s1 = pd.Series(np.random.randn(3), index=['a', 'c', 'e'])
s2 = pd.Series(np.random.randn(3), index=['a', 'd', 'e'])
print '{0}\n\n{1}'.format(s1, s2)
s1 + s2
运行结果为:
a -0.917905
c -0.744616
e 0.114522
a 0.721087
d -0.471575
e 0.796093
a -0.196818
c NaN
d NaN
e 0.910615
属性:name
s = pd.Series(np.random.randn(5), name='Some Thing')
s.name
运行结果为:
'Some Thing'
DataFrame
DataFrame 是二维带行标签和列标签的数组。可以把 DataFrame 想象成一个 Excel 表格或一个 SQL 数据库的表格,还可以想象成是一个 Series 对象字典。它是 Pandas 里最常用的数据结构。
创建 DataFrame 的基本格式是:
df = pd.DataFrame(data, index=index, columns=columns)
其中 index 是行标签,columns 是列标签,data 可以是下面的数据:
- 由一维 numpy 数组,list,Series 构成的字典
- 二维 numpy 数组
- 一个 Series
- 另外的DataFrame 对象
从字典创建
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
pd.DataFrame(d)
pd.DataFrame(d, index=['d', 'b', 'a'])
pd.DataFrame(d, index=['d', 'b', 'a'], columns=['two', 'three'])
d = {'one' : [1, 2, 3, 4],
'two' : [21, 22, 23, 24]}
pd.DataFrame(d)
pd.DataFrame(d, index=['a', 'b', 'c', 'd'])
从结构化数据创建
data = [(1, 2.2, 'Hello'), (2, 3., "World")]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'], columns=['A', 'B', 'C'])
从字典列表创建
data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
pd.DataFrame(data)
pd.DataFrame(data, index=['first', 'second'])
pd.DataFrame(data, columns=['a', 'b'])
从字典列表创建
d = {('a', 'b'): {('A', 'B'): 1, ('A', 'C'): 2},
('a', 'a'): {('A', 'C'): 3, ('A', 'B'): 4},
('a', 'c'): {('A', 'B'): 5, ('A', 'C'): 6},
('b', 'a'): {('A', 'C'): 7, ('A', 'B'): 8},
('b', 'b'): {('A', 'D'): 9, ('A', 'B'): 10}}
从Series创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
pd.DataFrame(s)
pd.DataFrame(s, index=['a', 'c', 'd'])
列的选择、增加、删除
df = pd.DataFrame(np.random.randn(6, 4), columns=['one', 'two', 'three', 'four'])
df
# 选择一列
df['one']
# 改变某一列的值
df['three'] = df['one'] + df['two']
df
# 添加新列
df['flag'] = df['one'] > 0
df
# 删除某列
del df['three']
df
# 弹出某列
four = df.pop('four')
four
# 添加一列 ,内容为固定标量
df['five'] = 5
df
# 添加一列,内容可截取其他列的一部分
df['one_trunc'] = df['one'][:2]
df
# 指定位置插入一列
df.insert(1, 'bar', df['one'])
df
用assign()方法插入新列(不改变原DataFrame)
df = pd.DataFrame(np.random.randint(1, 5, (6, 4)), columns=list('ABCD'))
df
# 创建一个新列
df.assign(Ratio = df['A'] / df['B'])
# 使用lamdba来定义函数
# 一次性创建多个新列
df.assign(AB_Ratio = lambda x: x.A / x.B, CD_Ratio = lambda x: x.C - x.D)
# 使用lambda来定义函数
# 连续使用assign()方法来创建多个新列
df.assign(AB_Ratio = lambda x: x.A / x.B).assign(ABD_Ratio = lambda x: x.AB_Ratio * x.D)
索引和选择
- 选择一列 -> df[col] -> Series
- 根据行标签选择一行 -> df.loc[label] -> Series
- 根据行位置选择一行 -> df.iloc[label] -> Series
- 选择多行 -> df[5:10] -> DataFrame
- 根据布尔向量选择多行 -> df[bool_vector] -> DataFrame
df = pd.DataFrame(np.random.randint(1, 10, (6, 4)), index=list('abcdef'), columns=list('ABCD'))
df
df['A']
df.loc['a']
# iloc对应的是第几行,而不是标签
df.iloc[0]
df[1:4]
df[[False, True, True, False, True, False]]
属性:数据对齐
属性:使用nump函数
Pandas 与 Numpy 在核心数据结构上是完全兼容的。
Panel
Panel 是三维带标签的数组。Panel 比较少用,但依然是最重要的基础数据结构之一。
- items: 坐标轴 0,索引对应的元素是一个DataFrame
- major_axis: 坐标轴 1, DataFrame里的行标签
- minor_axis: 坐标轴 2, DataFrame里的列标签
data = {'Item1' : pd.DataFrame(np.random.randn(4, 3)),
'Item2' : pd.DataFrame(np.random.randn(4, 2))}
pn = pd.Panel(data)
pn
运算结果为:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2
# 可以进行函数调用
pn.major_xs(pn.major_axis[0])
# 可以进行函数调用
pn.minor_xs(pn.major_axis[1])
# 转化为DataFrame
pn.to_frame()