1. Series一維,帶標籤數組 2. DataFrame二維,Series容器
In [15]: a = {string.ascii_uppercase[i]:i for i in range(10)} # 字典推導式建立一個字典a In [16]: a Out[16]: {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9} In [17]: pd.Series(a) # 經過字典建立一個Series,注意其中的索引就是字典的鍵 Out[17]: A 0 B 1 C 2 D 3 E 4 F 5 G 6 H 7 I 8 J 9 dtype: int64 In [18]: pd.Series(a, index=list(string.ascii_uppercase[5:15])) # 從新給其指定其餘索引以後,若是可以對應上,就取其值,若是不能就Nan Out[18]: F 5.0 G 6.0 H 7.0 I 8.0 J 9.0 K NaN L NaN M NaN N NaN O NaN dtype: float64 # pandas會自動根據數據類型更改series的dtype類型
咱們的這組數據存在csv中,咱們直接使用pd.read_csv便可mysql
和咱們想象的有些差異,咱們覺得他會是一個Series類型,可是他是一個DataFrame。sql
對於數據庫好比mysql或者mongodb中的數據咱們如何使用呢?
pd.read_sql(sql_sentence, connection)mongodb
In [4]: t = pd.DataFrame(np.arange(12).reshape((3, 4))) In [5]: t Out[5]: 0 1 2 3 0 0 1 2 3 1 4 5 6 7 2 8 9 10 11
DataFrame對象既有行索引,又有列索引
行索引,代表不一樣行,橫向索引,叫index,0軸,axis=0
列索引,表名不一樣列,縱向索引,叫columns,1軸,axis=1數據庫
和一個ndarray同樣,咱們經過shape,ndim,dtype瞭解這個ndarray的基本信息,那麼對於DataFrame咱們有什麼方法瞭解呢數組
DataFrame基礎屬性dom
df.shape # 行數 列數 df.dtypes # 列數據類型 df.nidm # 數據維度 df.index # 行索引 df.columns # 列索引 df.values # 對象值,二維ndarry數組
DataFrame總體狀況查詢函數
df.head(3) # 顯示頭部幾行,默認5行 df.tail(3) # 顯示末尾幾行,默認5行 df.info() # 相關信息概覽:行數,列數,列索引,列非空值個數,列類型,內存佔用 df.describe() # 快速綜合統計結果:計數,均值,標準差,最大值,四分位數,最小值 df.sort_values(by="Count_AnimalName", ascending=False) # 按照「Count_AnimalName」列降序排列
In [28]: df Out[28]: W X Y Z A 0 1 2 3 B 4 5 6 7 C 8 9 10 11 In [29]: df.loc["A", "W"] Out[29]: 0 In [30]: df.loc["A", ["W", "Z"]] Out[30]: W 0 Z 3 Name: A, dtype: int32 In [31]: type(df.loc["A", ["W", "Z"]]) Out[31]: pandas.core.series.Series # 選擇間隔的多行 In [32]: df.loc[["A", "C"], ["W", "Z"]] Out[32]: W Z A 0 3 C 8 11 In [33]: df.loc["A":, ["W", "Z"]] Out[33]: W Z A 0 3 B 4 7 C 8 11 # 冒號在loc裏面是閉合的,即會選擇到冒號後面的數據 In [34]: df.loc["A":"C", ["W", "Z"]] Out[34]: W Z A 0 3 B 4 7 C 8 11
對於NaN的數據,在numpy中咱們是如何處理的?
在pandas中咱們處理起來很是容易優化
判斷數據是否爲NaN:pd.isnull(df), pd.notnull(df)code
處理方式1:刪除NaN所在的行列dripna(axis=0, how='any', inplace=False)
處理方式2:填充數據,t.fillna(t.mean()), t.fillna(t.median()), t.fillna(0)orm
處理爲0的數據:t[t==0]=np.nan
固然並非每次爲0的數據都須要處理
計算平均值等狀況,nan是不參加計算的,可是0會
# 評分的平均分 rating_mean = df["Rating"].mean() # 導演的人數 temp_list = df["Actors"].str.split(",").tolist() nums = set([i for j in temp_list for i in j]) # 電影時長的最大值 max_runtime = df["Runtime (Minutes)"].max() max_runtime_index = df["Runtime (Minutes)"].argmax() min_runtime = df["Runtime (Minutes)"].argmin() runtime_median = df["Runtime (Minutes)"].median()
In [6]: t1 Out[6]: M N X Y A 0.0 0.0 0.0 0.0 B 0.0 0.0 0.0 0.0 In [7]: t2 Out[7]: 1 2 3 A 1.0 1.0 1.0 B 1.0 1.0 1.0 C 1.0 1.0 1.0 In [8]: t2.join(t1) Out[8]: 1 2 3 M N X Y A 1.0 1.0 1.0 0.0 0.0 0.0 0.0 B 1.0 1.0 1.0 0.0 0.0 0.0 0.0 C 1.0 1.0 1.0 NaN NaN NaN NaN In [9]: t1.join(t2) Out[9]: M N X Y 1 2 3 A 0.0 0.0 0.0 0.0 1.0 1.0 1.0 B 0.0 0.0 0.0 0.0 1.0 1.0 1.0
merge:按照指定的列把數據按照必定的方式合併到一塊兒
In [75]: t1 Out[75]: M N O P A 1.0 1.0 a 1.0 B 1.0 1.0 b 1.0 C 1.0 1.0 c 1.0 In [76]: t2 Out[76]: V W X Y Z A 0.0 0.0 c 0.0 0.0 B 0.0 0.0 d 0.0 0.0 In [77]: t1.merge(t2, left_on="O", right_on="X") Out[77]: M N O P V W X Y Z 0 1.0 1.0 c 1.0 0.0 0.0 c 0.0 0.0 In [78]: t1.merge(t2, left_on="O", right_on="X", how="inner") Out[78]: M N O P V W X Y Z 0 1.0 1.0 c 1.0 0.0 0.0 c 0.0 0.0 In [79]: t1.merge(t2, left_on="O", right_on="X", how="outer") Out[79]: M N O P V W X Y Z 0 1.0 1.0 a 1.0 NaN NaN NaN NaN NaN 1 1.0 1.0 b 1.0 NaN NaN NaN NaN NaN 2 1.0 1.0 c 1.0 0.0 0.0 c 0.0 0.0 3 NaN NaN NaN NaN 0.0 0.0 d 0.0 0.0 In [80]: t1.merge(t2, left_on="O", right_on="X", how="left") Out[80]: M N O P V W X Y Z 0 1.0 1.0 a 1.0 NaN NaN NaN NaN NaN 1 1.0 1.0 b 1.0 NaN NaN NaN NaN NaN 2 1.0 1.0 c 1.0 0.0 0.0 c 0.0 0.0 In [81]: t1.merge(t2, left_on="O", right_on="X", how="right") Out[81]: M N O P V W X Y Z 0 1.0 1.0 c 1.0 0.0 0.0 c 0.0 0.0 1 NaN NaN NaN NaN 0.0 0.0 d 0.0 0.0
grouped = df.groupby(by="columns name")
grouped是一個DataFrameGroupBy對象,是可迭代的
grouped中的每個元素是一個元組
元組裏面是(索引(分組的值),分組以後的DataFrame)
DataFrameGroupBy對象有不少通過優化的方法
函數名|說明
--|--
count|分組中非NA值的數量
sum|非NA值的和
mean|非NA值的平均值
median|非NA值的算術中位數
std、var|無偏(分母爲n-1)標準差和方差
min、max|非NA的最小值和最大值
若是咱們須要對國家和省份進行分組統計,應該怎麼操做呢?
grouped = df.groupby(by=[df["Country"], df["State/Province"]])
獲取分組以後的某一部分數據:
df.groupby(by=["Country", "State/Province"])["Country"].count()
對某幾列進行分組:
df["Country"].groupby(by=[df["Country"], df["State/Province"]]).count()
觀察結果,因爲只選擇了一列數據,因此結果是一個Series類型若是想返回一個DataFrame類型:
df[["Country"]].groupby(by=[df["Country"], df["State/Province"]]).count()
簡單的索引操做:
pd.date_range(start=None, end=None, periods=None, freq='D')
start和end以及freq配合可以生成start和end範圍內以頻率freq的一組時間索引
start和periods以及freq配合可以生成從start開始的頻率爲freq的periods個時間索引
In [23]: pd.date_range(start='20170101', end='20180101') Out[23]: DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08', '2017-01-09', '2017-01-10', ... '2017-12-23', '2017-12-24', '2017-12-25', '2017-12-26', '2017-12-27', '2017-12-28', '2017-12-29', '2017-12-30', '2017-12-31', '2018-01-01'], dtype='datetime64[ns]', length=366, freq='D') In [24]: pd.date_range(start='20170101', end='20180101', freq='BM') Out[24]: DatetimeIndex(['2017-01-31', '2017-02-28', '2017-03-31', '2017-04-28', '2017-05-31', '2017-06-30', '2017-07-31', '2017-08-31', '2017-09-29', '2017-10-31', '2017-11-30', '2017-12-29'], dtype='datetime64[ns]', freq='BM') In [25]: pd.date_range(start='20170101', end='20180101', freq='WOM-3FRI') Out[25]: DatetimeIndex(['2017-01-20', '2017-02-17', '2017-03-17', '2017-04-21', '2017-05-19', '2017-06-16', '2017-07-21', '2017-08-18', '2017-09-15', '2017-10-20', '2017-11-17', '2017-12-15'], dtype='datetime64[ns]', freq='WOM-3FRI')
別名 | 偏移量類型 | 說明 |
---|---|---|
D | Day | 每日曆日 |
B | BusinessDay | 每工做日 |
H | Hour | 每小時 |
T或min | Minute | 每分 |
S | Second | 每秒 |
L | ms | Milli |
U | Micro | 每微秒 |
M | MonthEnd | 每個月最後一個日曆日 |
BM | BusinessMonthEnd | 每個月最後一個工做日 |
MS | MonthBegin | 每個月第一個日曆日 |
BMS | BusinessMonthBegin | 每個月第一個工做日 |
df["timeStamp"] = pd.to_datetime(df["timeStamp"], format="")
format參數大部分狀況下能夠不用寫,可是對於pandas沒法格式化的時間字符串,咱們可使用該參數,好比包含中文
重採樣:指的是將時間序列從一個頻率轉化爲另外一個頻率進行處理的過程,將高頻率數據轉化爲低頻率數據爲降採樣,低頻率轉化爲高頻率爲升採樣
pandas提供了一個resample的方法來幫助咱們實現頻率轉化
In [78]: t = pd.DataFrame(np.random.uniform(10, 50, (100, 1)), index=pd.date_range(start="20170101", periods=100)) In [80]: t.resample("M").mean() Out[80]: 0 2017-01-31 28.025613 2017-02-28 30.814253 2017-03-31 33.023321 2017-04-30 27.950424 In [81]: t.resample("QS-JAN").count() Out[81]: 0 2017-01-01 90 2017-04-01 10