目录
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
未完待续