上一節學習了Series相關的概念,這部分的知識是學習pandas另一數據結構:DataFrame的基礎。
DataFrame是二維的、有標記的數據結構,它可以具有可能不同類型的列。
可以將其看做類似SQL表格,或者包含多個Series對象的字典。
DataFrame可接受數據類型
DataFrame可以接受多種數據輸入:
-
由一維ndarray構成的字典, 列表, 字典, 或者是Series
-
二維的ndarray
-
單獨的Series
-
其它的DataFrame
由字典構成DataFrame
如果構成dataframe的元素沒有對應的index,比如例子中的列名爲two的index是從a->b,但是列名爲one的index只有a,b,c,所以在形成的dataframe中,列one對應索引爲d的值爲NaN:
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.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
當然,也可以通過索引來構建DataFrame,只選取特定index的值構成dataframe:
d = {
'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])
}
print(pd.DataFrame(d, index=['d', 'b', 'a']))
->
one two
d NaN 4.0
b 2.0 2.0
a 1.0 1.0
通過list或者ndarray來構建dataframe
不指定index,默認從0開始,最大爲list或者是array的長度:
d = {'one': [1., 2., 3., 4.],
'two': [4., 3., 2., 1.]}
df = pd.DataFrame(d)
print(df)
->
one two
0 1.0 4.0
1 2.0 3.0
2 3.0 2.0
3 4.0 1.0
df = pd.DataFrame(d,index=['a','b','c','d'])
print(df)
->
one two
a 1.0 4.0
b 2.0 3.0
c 3.0 2.0
d 4.0 1.0
通過多個dict構建dataframe
這塊的邏輯其實和通過ndarray構建dataframe的邏輯差不多:
data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
print(pd.DataFrame(data2))
print(pd.DataFrame(data2, index=['first', 'second']))
->
a b c
0 1 2 NaN
1 5 10 20.0
a b c
first 1 2 NaN
second 5 10 20.0
查看dataframe的列和行:
查看行枚舉值:df.index
查看列枚舉值:df.columns
不同的構造函數:
1.DataFrame.from_dict
2.DataFrame.from_records
通過以上兩種構造函數,可以將dict和tuple列表以及結構化的ndarray構建成dataframe。
在語義上,DataFrame可以看爲相似索引的Series對象的字典。 獲取,設置和刪除列的語法與dict操作的語法類似。
DataFrame可以選取特定列,增加列,刪除列等等操作......
#選取列
data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
df2=pd.DataFrame(data2)
print(df2)
print(df2['a'])
->
a b c
0 1 2 NaN
1 5 10 20.0
0 1
1 5
Name: a, dtype: int64
#增加
df2['d']=df2['a']*df2['b']
print(df2)
->
a b c d
0 1 2 NaN 2
1 5 10 20.0 50
#刪除
del df2['d']
df2.pop('c')
print(df2)
->
a b
0 1 2
1 5 10
當然,dataframe裏面可以指定位置插入列:
df2.insert(1, 'bar', df2['a'])
print(df2)
->
a bar b
0 1 1 2
1 5 5 10