Python Pandas DataFrame
数据框是一种二维数据结构,即数据以表格的方式排列在行和列中。
DataFrame的特点
- 潜在的列是不同类型的
- 大小 – 可变
- 标记的轴(行和列)
- 可以对行和列进行算术运算
结构
让我们假设,我们正在创建一个包含学生数据的数据框。
你可以把它看成是一个SQL表或电子表格的数据表示。
pandas.DataFrame
可以使用以下构造函数创建pandas DataFrame −
pandas.DataFrame( data, index, columns, dtype, copy)
构造函数的参数如下:
序号 | 参数和描述 |
---|---|
1 | data 数据有多种形式,如ndarray, series, map, lists, dict, constants和另一个DataFrame。 |
2 | index 对于行标签,如果没有传递索引,则可选择默认为np.range(n),用于生成框架的索引。 |
3 | columns 对于列标签,可选的默认语法是 – np.range(n)。只有在没有传递索引的情况下,这才是真的。 |
4 | dtype 每一列的数据类型。 |
5 | copy 这个命令(或者叫什么)是用来复制数据的,如果默认为False。 |
创建数据框架
pandas DataFrame可以使用各种输入创建,例如 −
- 列表
- 数据集
- 系列
- Numpy ndarrays
- 另一个DataFrame
在本章的后续章节中,我们将看到如何使用这些输入创建一个DataFrame。
创建一个空的数据框架
一个基本的DataFrame可以被创建,它是一个空的DataFrame。
例子
#import the pandas library and aliasing as pd
import pandas as pd
df = pd.DataFrame()
print df
其 输出结果 如下 –
Empty DataFrame
Columns: []
Index: []
从列表中创建一个数据框架
DataFrame可以用一个单一的列表或一个列表来创建。
例1
import pandas as pd
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print df
其 输出结果 如下 –
0
0 1
1 2
2 3
3 4
4 5
例2
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
print df
其 输出结果 如下 –
Name Age
0 Alex 10
1 Bob 12
2 Clarke 13
示例3
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print df
其 输出结果 如下 –
Name Age
0 Alex 10.0
1 Bob 12.0
2 Clarke 13.0
注意 - 观察一下, dtype 参数将Age列的类型改为浮点。
从ndarrays/Lists的Dict创建一个DataFrame
所有的 ndarrays 必须是相同的长度。如果索引被传递,那么索引的长度应该等于数组的长度。
如果没有传递索引,那么默认情况下,索引将是range(n),其中 n 是数组长度。
例子1
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)
print df
其 输出结果 如下 –
Age Name
0 28 Tom
1 34 Jack
2 29 Steve
3 42 Ricky
注意 - 观察数值0,1,2,3。它们是使用函数range(n)分配给每个人的默认索引。
例2
现在让我们使用数组创建一个有索引的DataFrame。
import pandas as pd
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])
print df
其 输出结果 如下 –
Age Name
rank1 28 Tom
rank2 34 Jack
rank3 29 Steve
rank4 42 Ricky
注意 - 观察一下, 索引 参数为每一行分配了一个索引。
从Dict列表中创建一个DataFrame
列表中的字典可以作为输入数据被传递来创建一个DataFrame。字典的键默认为列名。
例子1
下面的例子显示了如何通过传递一个字典列表来创建一个DataFrame。
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print df
其 输出结果 如下 –
a b c
0 1 2 NaN
1 5 10 20.0
注意 - 观察一下,NaN(不是一个数字)被附加在缺失的地方。
例2
下面的例子显示了如何通过传递一个字典列表和行索引来创建一个DataFrame。
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data, index=['first', 'second'])
print df
其 输出结果 如下 –
a b c
first 1 2 NaN
second 5 10 20.0
例3
下面的例子展示了如何创建一个带有字典列表、行索引和列索引的DataFrame。
import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
#With two column indices, values same as dictionary keys
df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
#With two column indices with one index with other name
df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
print df1
print df2
其 输出结果 如下 –
#df1 output
a b
first 1 2
second 5 10
#df2 output
a b1
first 1 NaN
second 5 NaN
注意 - 观察一下,df2 DataFrame创建时的列索引不是字典中的键;因此,在原地追加了NaN。而df1创建时的列索引与字典的键值相同,所以追加了NaN。
从系列的字典中创建一个DataFrame
系列的字典可以被传递来形成一个 DataFrame。结果索引是所有传递的系列索引的联合。
例子
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df
其 输出结果 如下 –
one two
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
注意 - 观察一下,对于系列一,没有传递标签 ‘d ‘,但在结果中,对于 d 标签,NaN被附加了NaN。
现在让我们通过例子来了解 列的选择、添加 和 删除 。
列的选择
我们将通过从DataFrame中选择一列来理解这个问题。
例子
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df ['one']
其 输出结果 如下 –
a 1.0
b 2.0
c 3.0
d NaN
Name: one, dtype: float64
列的增加
我们将通过向现有的数据框架添加一个新的列来理解这个问题。
例子
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
# Adding a new column to an existing DataFrame object with column label by passing new series
print ("Adding a new column by passing as Series:")
df['three']=pd.Series([10,20,30],index=['a','b','c'])
print df
print ("Adding a new column using the existing columns in DataFrame:")
df['four']=df['one']+df['three']
print df
其 输出结果 如下 –
Adding a new column by passing as Series:
one two three
a 1.0 1 10.0
b 2.0 2 20.0
c 3.0 3 30.0
d NaN 4 NaN
Adding a new column using the existing columns in DataFrame:
one two three four
a 1.0 1 10.0 11.0
b 2.0 2 20.0 22.0
c 3.0 3 30.0 33.0
d NaN 4 NaN NaN
列的删除
列可以被删除或弹出;让我们举一个例子来了解如何删除。
例子
# Using the previous DataFrame, we will delete a column
# using del function
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd']),
'three' : pd.Series([10,20,30], index=['a','b','c'])}
df = pd.DataFrame(d)
print ("Our dataframe is:")
print df
# using del function
print ("Deleting the first column using DEL function:")
del df['one']
print df
# using pop function
print ("Deleting another column using POP function:")
df.pop('two')
print df
其 输出结果 如下 –
Our dataframe is:
one three two
a 1.0 10.0 1
b 2.0 20.0 2
c 3.0 30.0 3
d NaN NaN 4
Deleting the first column using DEL function:
three two
a 10.0 1
b 20.0 2
c 30.0 3
d NaN 4
Deleting another column using POP function:
three
a 10.0
b 20.0
c 30.0
d NaN
行的选择、增加和删除
现在我们将通过实例来理解行选择、增加和删除。让我们从选择的概念开始。
通过标签选择
行可以通过向 loc 函数传递行标签来进行选择。
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.loc['b']
其 输出结果 如下 –
one 2.0
two 2.0
Name: b, dtype: float64
结果是一个系列,其标签是DataFrame的列名。而且,系列的名称是它被检索的标签。
按整数位置选择
可以通过向 iloc 函数传递整数位置来选择行。
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df.iloc[2]
其 输出结果 如下 –
one 3.0
two 3.0
Name: c, dtype: float64
分片排队
使用’:’操作符可以选择多行。
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
print df[2:4]
其 输出结果 如下 –
one two
c 3.0 3
d NaN 4
增加行数
使用 append 函数向DataFrame添加新行。这个函数将把行追加到最后。
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
print df
其 输出结果 如下 –
a b
0 1 2
1 3 4
0 5 6
1 7 8
删除行
使用索引标签从DataFrame中删除或删除行。如果标签是重复的,那么多个行将被删除。
如果你观察,在上面的例子中,标签是重复的。让我们删除一个标签,看看有多少行会被删除。
import pandas as pd
df = pd.DataFrame([[1, 2], [3, 4]], columns = ['a','b'])
df2 = pd.DataFrame([[5, 6], [7, 8]], columns = ['a','b'])
df = df.append(df2)
# Drop rows with label 0
df = df.drop(0)
print df
其 输出结果 如下 –
a b
1 3 4
1 7 8
在上面的例子中,有两行被删除,因为这两行包含相同的标签0。