刚刚使用Python进行数据分析,分享一些概念和想法,希望可以大家一起讨论,如果理解或者表达有不准确的地方,请多多指点,不吝赐教,非常感谢~~

本文将介绍Pandas操作的最后一个部分,前两篇分别是:
《Pandas的基础操作:介绍/创建/查看数据/赋值》:
《Pandas的基础操作:合并数据.merge()函数的使用》:


8. 排序:

(1)索引排序:data.sort_index()

应用场景:在使用sklean的时候,会将原数据随机抽取一部分作为“训练集”,这是随机抽取的结果就会打乱原数据的索引,当不需要改变索引,但是需要从新排序时

参数说明:
a. 参数axis:默认值为0表示按行索引排序;axis=1时表示按列索引排序
b. 参数by:指定列名,默认值为空
c. 参数ascending:默认值为True表示正序;ascending=False时表示倒序
d. 参数inpalce:是否用排序后的数据集替换原来的数据,默认为False,即不替换

以下列数据为例:

data = pd.DataFrame({'A': ['food','fruit','food','fruit',
                         'food','water','food','fruit'],
                   'D': ['one','one','two','three',
                         'two','two','one','three'],
                   'C': np.random.randint(5,size=8),
                   'B': np.random.randn(8)})

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_原始数据


data.sort_index(axis=1)

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_数据_02

其中axis=0默认的情况即为原始数据;没有指定index所以系统自动生成从小到大的行索引
排序之后,重新打印data显示原始数据,因为参数inplace=False

data.sort_index(by="D")
data.sort_index(by=["D","C"])

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_原始数据_03


python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_数据_04

需要注意的是:
a. 只对"D"排序的时候,按照字母顺序:one>three>two
b. 对"D"和"C"一起排序的时候,是先排"D"列,如果"D"列中有重复值时,才会根据"C"列内容排序
c. 排序之后,重新打印data显示原始数据,因为参数inplace=False

data.sort_index(axis=1,ascending=False,inplace=True)
data

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_原始数据_05

此时由于参数inpalce=True,所以修改的原数据,从新打印data时,是被操作过的数据

(2)按照某列的值进行排序:data.sort_values(by="X")

参数说明:
a. 参数by:指定列名,必填参数
b. 参数axis:默认值为0表示按行索引排序;axis=1时表示按列索引排序
c. 参数ascending:默认值为True表示正序;ascending=False时表示倒序
d. 参数inpalce:是否用排序后的数据集替换原来的数据,默认为False,即不替换
e. 参数na_position:设定缺失值的显示位置,可以选择‘first’或‘last’

以上面数据data为例,但是重新对其附一些空值

# 对5行0列的数字附空值;对“B”列中1,2行两个值附空值
data.iat[5,0]=np.nan
data.loc[df.index[1:3],"B"]=np.nan
data

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_默认值_06


data.sort_values(by=["A","C"],na_position="last")

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_原始数据_07

9. 设定索引:

(1)将数据中的列作为行索引:

data.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)

参数说明

a. 设置索引的参数是keys
b. append添加新索引
c. drop为False时,成功设置了index,同时列数据中仍然保存着index字段
d. inplace为True时,修改了原始数据

使用原始的data数据作为例子:


# 对比设置index顺序不同的结果
df.set_index(keys=['A', 'D'])
df.set_index(keys=['D','A'])

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_默认值_08


python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_默认值_09

可以看出来,虽然后者的操作后,看上去好像将"D"中重复的数据而"A"中不重复的数据进行堆叠,形成看似有“层级”关系的状态;
但实际上仍然是在临近数据有相同值时省略表示而已。
如果需要“层级”的表现,需要对数据进行更复杂操作

(2)还原索引:

应用场景:在使用contact等合并数据之后,index可能发生重复;或者在进行排序,删除等操作时,index会发生顺序混乱。这些不是我们希望的那样,所以,除了对行索引排序以外,还可能需要对行索引进行重新设置

data.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill=”)

由于上面数据没有办法很好显示出来“层级”的关系,所以重新创建数据,并以其作为例子:

index = pd.MultiIndex.from_product([['TX', 'FL', 'CA'], ['North', 'South']], 
                                   names=['State', 'Direction'])
data1 = pd.DataFrame(index=index, data=np.random.randint(0, 10, (6,4)), columns=list('abcd'))

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_原始数据_10


data1.reset_index()

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_默认值_11

效果等同于 data1.reset_index(level=[‘State’,’Direction’])

data1.reset_index(level=1) 
# or 
data1.reset_index(level=‘Direction’)

python 第一列数据成了索引 第一列成了空值 pandas设置第一列为索引_默认值_12