目录
基本特征
创建
自动生成行索引
自定义生成行索引
使用
索引与值
基本操作
统计功能
DataFrame与Series相比,除了可以每一个键对应许多值之外,还增加了列索引(columns)这一内容,具体内容如下所示:
DataFrame也能自动生成行索引,索引从0开始,代码如下所示:
import pandas as pd
data = {'name': ['aaaaaa', 'bbbbbb', 'cccccc'], 'pay': [4000, 5000, 6000]} # 以name和pay为列索引,创建DataFrame
frame = pd.DataFrame(data) #自定义行索引
print(frame)
运行结果如下所示:
name pay
0 aaaaaa 4000
1 bbbbbb 5000
2 cccccc 6000
DataFrame除了能创建自动生成行索引外,还能自定义生成行索引,代码如下所示:
import pandas as pd
import numpy as np
data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay']) # 自定义列索引
print(frame)
运行结果如下所示:
name pay
1 aaaa 4000
2 bbbb 5000
3 cccc 6000
我们可以通过一些基本方法来查看DataFrame的行索引、列索引和值,代码如下所示:
import pandas as pd
import numpy as np
data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(frame.columns) # 输出列索引
print(frame.index) # 输出行索引
print(frame.values) # 输出值
运行结果如下所示:
行索引
Index(['name', 'pay'], dtype='object')
列索引
RangeIndex(start=1, stop=4, step=1)值
[['aaaa' '4000']
['bbbb' '5000']
['cccc' '6000']]
除了进行查看,我们还能简单的对行索引和列索引进行修改,具体代码如下所示:
import pandas as pd
import numpy as np
data = np.array([('aaaa', 4000), ('bbbb', 5000), ('cccc', 6000)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(frame)
frame.columns = ['newname', 'newpay']
frame.index = range(2, 5)
print("---------------")
print(frame)
print("---------------")
print(frame.columns) # 修改后的列索引
print(frame.index) # 修改后的行索引
运行结果如下所示:
name pay
1 aaaa 4000
2 bbbb 5000
3 cccc 6000
---------------
newname newpay
2 aaaa 4000
3 bbbb 5000
4 cccc 6000
---------------
Index(['newname', 'newpay'], dtype='object')
RangeIndex(start=2, stop=5, step=1)
具体实现如下代码所示:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
print(frame['name']) # 取得某列
print(frame.pay) # 取得某列
print(frame.iloc[1:3, 1]) # 第一行和第二行的第一列
print(frame.iloc[0:2, 0]) # 第零行和第一行的第零列(第一个0可省略)
print(frame.iloc[0:2]) # 少了第二个参数,就会输出所有列
print(frame.iloc[0:2, 1:3]) # 逗号左边操控行,右边操控列
运行结果如下所示:
取得name列
1 xiaoming
2 xiaohong
3 xiaolan
Name: name, dtype: object取得pay列
1 4000
2 5000
3 6000
Name: pay, dtype: object取得第一行和第二行的第一列
2 5000
3 6000
Name: pay, dtype: object取得第零行和第一行的第零列
1 xiaoming
2 xiaohong
Name: name, dtype: object少了第二个参数,就会输出所有列
name pay a
1 xiaoming 4000 1
2 xiaohong 5000 2逗号左边操控行,右边操控列
pay a
1 4000 1
2 5000 2
具体代码如下所示:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
frame['name'] = 'admin' # 将name一列全部换成admin
print(frame)
del frame['pay'] # 将pay一列全部删除
print(frame)
print(frame.drop(1, axis=0)) # 删除第一行
print(frame.drop(index=2)) # 另一种删除方法
运行结果如下所示:
将name一列全部换成admin
name pay a
1 admin 4000 1
2 admin 5000 2
3 admin 6000 3将pay一列全部删除
name a
1 admin 1
2 admin 2
3 admin 3删除第一行
name a
2 admin 2
3 admin 3另一种删除方法
name a
1 admin 1
3 admin 3
(1)添加列
添加列可直接赋值,例如给 aDF 中添加 tax 列的方法如下:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(aDF)
print("===============================")
aDF['tax'] = [0.05, 0.05, 0.1] # 添加列
print(aDF)
运行结果如下所示:
name pay
1 xiaoming 4000
2 xiaohong 5000
3 xiaolan 6000
===============================
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
(2)添加行
添加行可用对象的标签(loc)和位置(iloc)索引,也可通过 append()方法或 concat()函数等进行处理,以 loc 为例,例如要给 aDF 添加一个新行,可用如下方法:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
print(aDF)
print("===============================")
aDF['tax'] = [0.05, 0.05, 0.1] # 添加列
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05} # 添加行
print(aDF)
运行结果如下所示:
name pay
1 xiaoming 4000
2 xiaohong 5000
3 xiaolan 6000
===============================
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
(3)删除行
删除数据可直接用“del 数据”的方式进行,但这种方式是直接对原始数据操作,不是很安全,pandas 中可利用 drop()方法删除指定轴上的数据,drop()方法返回一个新的对象,不会直接修改原始数据。
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
print(aDF.drop(5)) # 返回删除第5行的数据,但本身未改变
print("===============================")
print(aDF) # 自身未改变
运行结果如下所示:
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
===============================
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
===============================
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
(3)删除列
代码如下:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
print(aDF.drop('tax', axis=1))
print("===============================")
print(aDF) # 自身未改变
运行结果如下所示:
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
===============================
name pay
1 xiaoming 4000
2 xiaohong 5000
3 xiaolan 6000
5 Liuxi 5000
===============================
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
通过修改参数的值,可以改变原来的数据,代码如下:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
aDF.drop('tax', axis=1, inplace=True)
print(aDF) # 自身改变
运行结果如下所示:
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
===============================
name pay
1 xiaoming 4000
2 xiaohong 5000
3 xiaolan 6000
5 Liuxi 5000
(4)修改
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000), ('xiaohong', 5000), ('xiaolan', 6000)])
aDF = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay'])
aDF['tax'] = [0.05, 0.05, 0.1]
aDF.loc[5] = {'name': 'Liuxi', 'pay': 5000, 'tax': 0.05}
print(aDF)
print("===============================")
aDF['tax'] = 0.03 # 将一列修改为相同的值
print(aDF)
print("===============================")
aDF.loc[5] = ['Liuxi', 9800, 0.05] # 修改某一行
print(aDF)
print("===============================")
print(aDF.loc[:, ['name', 'tax', 'pay']]) # 交换列
print("===============================")
print(aDF.iloc[:, [0, 2, 1]]) # 交换列
运行结果如下所示:
name pay tax
1 xiaoming 4000 0.05
2 xiaohong 5000 0.05
3 xiaolan 6000 0.10
5 Liuxi 5000 0.05
===============================将一列修改为相同的值
name pay tax
1 xiaoming 4000 0.03
2 xiaohong 5000 0.03
3 xiaolan 6000 0.03
5 Liuxi 5000 0.03
===============================修改某一行
name pay tax
1 xiaoming 4000 0.03
2 xiaohong 5000 0.03
3 xiaolan 6000 0.03
5 Liuxi 9800 0.05
===============================交换列
name tax pay
1 xiaoming 0.03 4000
2 xiaohong 0.03 5000
3 xiaolan 0.03 6000
5 Liuxi 0.05 9800
===============================交换列
name tax pay
1 xiaoming 0.03 4000
2 xiaohong 0.03 5000
3 xiaolan 0.03 6000
5 Liuxi 0.05 9800
注: DataFrame对象的修改和删除还有很多方法,在此不一一列举,有兴趣的同学可以自己去找一下
DataFrame有非常强大的统计功能,它有大量的函数可以使用,具体代码如下所示:
import pandas as pd
import numpy as np
data = np.array([('xiaoming', 4000, 1), ('xiaohong', 5000, 2), ('xiaolan', 6000, 3)])
frame = pd.DataFrame(data, index=range(1, 4), columns=['name', 'pay', 'a'])
print(frame.pay.min()) # 取得最小值
print(frame[frame.pay >='5000']) # 找出工资>=5000人员的信息
运行结果如下所示:
工资最低值
4000
工资>=5000人员的信息
name pay a
2 xiaohong 5000 2
3 xiaolan 6000 3
未完待续