Pandas處理以下三個數據結構 -
- 系列(
Series
)----一維ndarray? ? ? 特點:帶有標簽,可以使用標簽作為索引,大小不能改變,內部數據可以改變。
? ? ? ? ? 屬性:與NumPy類似,多了一個軸標簽axis lables - 數據幀(
DataFrame
)---二維ndarray? ? ? ? ? ? ? ? ? 特點:帶標簽,可以同行列標簽索引,尺度可變,數據可變 - 面板(
Panel
) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?特點:面板是具有異構數據的三維數據結構。在圖形表示中很難表示面板
這些數據結構構建在Numpy數組之上,這意味著它們很快。
考慮這些數據結構的最好方法是,較高維數據結構是其較低維數據結構的容器。 例如,DataFrame
是Series
的容器,Panel
是DataFrame
的容器。
1.對象的創建:數組 ?字典 ?標量值或常數
import pandas as pd import numpy as nps = pd.Series([1,3,5,np.nan,6,8])print(s)
輸出:
0 1.0 1 3.0 2 5.0 3 NaN 4 6.0 5 8.0 dtype: float64
通過傳遞numpy
數組,使用datetime
索引和標記列來創建DataFrame
dates = pd.date_range('20180701', periods=7) print(dates)print("--"*16) df = pd.DataFrame(np.random.randn(7,4), index=dates, columns=list('ABCD')) print(df)
輸出:
DatetimeIndex(['2018-07-01', '2018-07-02', '2018-07-03', '2018-07-04','2018-07-05', '2018-07-06', '2018-07-07'],dtype='datetime64[ns]', freq='D') --------------------------------A B C D 2018-07-01 -0.500163 0.032670 -1.026652 -0.444624 2018-07-02 0.870395 -1.879662 0.476651 0.546444 2018-07-03 -0.182999 -0.497964 0.840211 0.256168 2018-07-04 1.130527 -0.664251 -0.226294 1.660457 2018-07-05 -1.304568 0.204915 0.366062 1.905667 2018-07-06 0.605275 0.356298 -0.561465 -0.000841 2018-07-07 0.226876 0.998272 0.592386 0.306725
2.查看數據
x.head()可以查看頂部數據 ? ? ? ?x.tail()可以輸入參數,查看指定個數的底部數據
?
df1 = pd.DataFrame([22,24,54,65,76,88,98], columns=list('A')) print(df1.head()) print("--------------" * 10) print(df1.tail(3))
?
輸出:
A 0 22 1 24 2 54 3 65 4 76 ------------------------------------------------------------------------------------A 4 76 5 88 6 98
3.x.describe()描述顯示數據的快速統計摘要,參考以下示例代碼
dates = pd.date_range('20180701', periods=7) df = pd.DataFrame(np.random.randn(7,4), index=dates, columns=list('ABCD')) print(df.describe())
輸出:
A B C D count 7.000000 7.000000 7.000000 7.000000 mean -0.051137 -0.290501 -0.308145 -0.287636 std 0.720711 1.084754 0.946105 0.615045 min -0.766295 -1.789795 -1.962022 -1.262667 25% -0.658085 -1.213707 -0.778745 -0.468529 50% -0.286046 0.302139 0.020762 -0.379909 75% 0.496656 0.476699 0.207962 -0.100779 max 1.017243 0.928164 0.925811 0.767738
4.排序
(1)標簽索引的排序----sort_index(axis=1,ascending=False)
其中ascending默認為True,升序排序
(2)元素單列排序:----sort_values(by=‘B’)
默認會按所在列進行升序排序
5.選擇系列元素 , 通過【】使用
值得注意的是:利用dataframe時,做切片用的標簽邊界可以取到,而作為下標的右邊界是取不到的。
(1)按標簽選擇:loc /at ? ? 按下標選擇:iloc/iat
?
print(df.loc[dates[0]])
?
輸出:
A 1.320921 B 0.522823 C 0.340569 D -1.911398 Name: 2017-01-01 00:00:00, dtype: float64
(2)通過標簽選擇多軸,其中:處也可以寫行標簽
print(df.loc[:,['B','D']])
輸出:
B D 2017-01-01 0.522823 -1.911398 2017-01-02 -0.354351 -1.719314 2017-01-03 -0.166968 -0.623292 2017-01-04 -1.198105 0.824853 2017-01-05 -0.829653 0.310548 2017-01-06 -0.964786 0.051597
?
?
(3)布爾索引
也可以根據isin()的參數條件進行過濾,使用參考教程。
print(df[df.A>0])
輸出:
A B C D 2017-01-01 1.320921 0.522823 0.340569 -1.911398 2017-01-03 0.991224 -0.166968 0.840899 -0.623292 2017-01-04 0.240294 -1.198105 0.021427 0.824853 2017-01-06 0.683117 -0.964786 -0.159696 0.051597
5.(1)列的選擇 ?df['列名']
(2)列的添加:df['列名']=df.Serices[數組]
(3)列的刪除:del ?df['列名']
6.(1)行的選擇 ?df[]切片、loc標簽索引
(2)行的添加:df.append(df系列)
(3)行的刪除:df.drop(索引)
7.迭代
for col in df:print (col)
輸出:
A
B
C
D
表示:如果只是迭代df對象,而非他的迭代器迭代,則只會輸出dataframe的列名。
(1)所以迭代列應該為:
for key,value in df.iteritems():print (key,value)
(2)迭代行為:
for row_index,row in df.iterrows():print (row_index,row)
(3)itertuples()
方法將為DataFrame
中的每一行返回一個產生一個命名元組的迭代器。元組的第一個元素將是行的相應索引值,而剩余的值是行值。
?
注意 - 不要嘗試在迭代時修改任何對象。迭代是用于讀取,迭代器返回原始對象(視圖)的副本,因此更改將不會反映在原始對象上。
7.分組和聚合
?
GroupBy()/ Agg()
(1)任何分組(groupby)操作都涉及原始對象的以下操作之一。它們是 -
- 分割對象
- 應用一個函數
- 結合的結果
在許多情況下,我們將數據分成多個集合,并在每個子集上應用一些函數。在應用函數中,可以執行以下操作 -
- 聚合?- 計算匯總統計
- 轉換?- 執行一些特定于組的操作
- 過濾?- 在某些情況下丟棄數據
?
?
df.groupby('列名').groups
或
grouped = df.groupby('列名')for name,group in grouped:print (name)print (group)
get_group()
方法,可以選擇一個組
(2)聚合函數為每個組返回單個聚合值。當創建了分組(group by)對象,就可以對分組數據執行多個聚合操作。
一個比較常用的是通過聚合或等效的agg
方法聚合。
grouped = df.groupby('列名1') print (grouped['列名2'].agg(np.mean))
(3)轉換
分組或列上的轉換返回索引大小與被分組的索引相同的對象。因此,轉換應該返回與組塊大小相同的結果。
print (grouped.transform(score))
(4)過濾
過濾根據定義的標準過濾數據并返回數據的子集。filter()
函數用于過濾數據。
filter = df.groupby('Team').filter(lambda x: len(x) >= 3)print (filter)
8.可視化
df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('2018/12/18',periods=10), columns=list('ABCD'))df.plot()
bar
或barh
為條形hist
為直方圖boxplot
為盒型圖area
為“面積”scatter
為散點圖
import pandas as pd from matplotlib import pyplot as plt import numpy as np import random df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('2018/12/18',periods=10), columns=list('ABCD')) df.plot() plt.show()
輸出:
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d']) df.plot.bar() plt.show()
輸出:
?
其余圖形類似上面的方法,各種圖形請參考Matplotlib官網,詳細介紹會在下一篇博客,請關注留言。