DataFrame 可以看作包含两个Index类(index、columns)、一个二维ndarray类
(values)
二维values + 结构化index + 结构化columns
values自己还有两根只能使用integer indice的轴
结构同数据库表相似:列为属性,行为个体
1 2 3 4 5 6 7 8 9 DF = pd.DataFrame( data=ndarray/{col_name: val}/DF/array-like, index=Index/array-like, columns=Index/array-like, dtype=None /dtype, copy=False )
DF行列逻辑 可以通过DF = df1.T
作转制更改行列逻辑
获取数据 列优先 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Ser = df1[col_name] Ser = df1.col_name Ser = df1[col_level_0, col_level_1,...] Ser = df1[(col_level_0, col_level_1,...)] Ser = df1.col_level_0.col_level_1 Val = df1[col_name][index_name] Val = df1.col_name.index_name Val = df1[col_level_0, col_level_1,...]\ [index_level_0, index_level_1,...] Val = df1[(col_level_0, col_level_1,...)]\ [index_level_0, index_level_1,...] Val = df1.col_level_0.col_level_1....\ .index_level_0.index_level_1... DF = df1[cond1 & cond2 &...] DF = df1[cond1][cond2]...
行优先 .loc[]
行优先,逻辑和df1[]列优先类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Ser = df.loc[index_name] Ser = df.loc[index_level_0, index_level_1,...] Ser = df.loc[(index_level_0, index_level_1,...)] Val = df1.loc[index_name, column_name] Val = df1.loc[index_level_0, index_level_1,...]\ [col_level_0, col_level_1,...] Val = df1.loc[(index_level_0, index_level_1,...)]\ [(col_level_0, col_level_1,...)]
.iloc[]
indices locate,应视为对value(ndarray)进行操作,index和
columns的结构对其没有任何影响
1 2 3 4 Ser = df1.iloc[indice] Val = df1.iloc[index_indice, col_indice]
.ix[]
.loc
、.iloc
的封装,不建议使用
优先使用.loc
,除非参数为int、且Index不是int类型
行优先快速版本 只能 、必须 取一个值
切片 Values切片 切片对象是values
1 2 3 4 5 DF = df1.iloc[irow_start: irow_end, icol_start: icol_end]
Index切片 切片对象是index,包括上限
全切片 1 2 3 4 DF = df1.loc[ (index_0, index_1,...): (index_0, index_1,...), (col_0, col_1,...): (col_0, col_1,...)]
行切片 1 2 3 4 DF = df1.loc[[(index_0, index_1,...),...]] DF = df1.loc[(index_0, index_1,...): (index_0, index_1,...)]
列切片 1 2 3 4 DF = df1[[col_name,...]] DF = df1.loc[:, (col_0,...): (col_0,...)]
DF数据共享逻辑 DF数据(values)共享的逻辑
一般尽量共享数据,直至无法处理(数据同时增加/删除行、列)
有些方法会有copy
参数,可以显式控制是否拷贝副本
1 2 3 4 5 6 7 8 9 df1_T = df1.T df1_T["new_col_1" ] = [ ] df1["new_col_2" ] = [ ]
Index 索引 使用integer作为index时注意df1.ix[]的逻辑
MultiIndex 层级索引 层级索引允许以低维度形式表示高纬度数据
层级索引可以使用tuple形式表示:(level_0, level_1,...)
需要注意区分和tuple本身作为index
打印时可以tuple有括号,而层级索引没有
层级索引有时可以省略括号
from_arrays
1 2 3 4 5 6 7 8 9 10 11 Index = pd.MultiIndex.from_arrays( arrays([[],[]]), sortorder=None /int , names=None /[]) Index = [ level_0_list, level_1_list,...]
说明:将arrays转换为MultiIndex
参数
arrays
:包含多个list作为各个level索引
各list按照传递顺序决定level
不会自动合并 不连续labels(否则需要交换数据位置)
sortorder
:sortedness级别?
names
:level名
from_tuples
1 2 3 4 Index = pd.MultiIndex.from_tuples( tuples=[tuple -like], sortorder=None /int , names=None )
说明:将tuples
转换为MultiIndex
参数
tuples
:每个tuple为一个index,按照tuple中元素顺序
决定各元素level
from_product
1 2 3 4 Index = pd.MultiIndex.from_product( iterables([[]]/[iterables]), sortorder=None /int , names)
说明:对iterables
元素作product(积)作为MultiIndex
Series:可以看作是包含一个Index类(index,存放标签)、一个一维ndarray类(values,存放数据)
a. ser=pd.Series(data=np.darray/dict, index=list)
b. Series对象可以处理标签不一致的数据,但是只有标签的交集才能得到有意义的结果,其余为NaN
c. 其余性质类似于DataFrame对象
Index属性#todo
a. index属性
df1.columns=[]:更改列名称,index同
df1.columns.names=[]:更改列名,index同
pandas库中的其他一些问题
a. 数据类型转换:Series对象和DF对象在运算过程中dtype类型可能发生”无意义”的转换
dtype=i8的对象之间的+、-结果为dtype=f8类型的对象(当然这个可能是保持和\的一致性)
SeriesObj.reindex(new_index)会”可能”会改变原有数据类型(由i8->f8)(有增加新index时)