pandas

pandas的經常使用數據類型

1. Series一維,帶標籤數組
2. DataFrame二維,Series容器

pandas之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類型

pandas之讀取外部數據

咱們的這組數據存在csv中,咱們直接使用pd.read_csv便可mysql

和咱們想象的有些差異,咱們覺得他會是一個Series類型,可是他是一個DataFrame。sql

對於數據庫好比mysql或者mongodb中的數據咱們如何使用呢?
pd.read_sql(sql_sentence, connection)mongodb

pandas之DataFrame

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數據庫

pandas之DataFrame

和一個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」列降序排列

pandas之loc

  1. df.loc 經過標籤索引行數據
  2. df.iloc 經過位置獲取行索引
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會

pandas經常使用統計方法

# 評分的平均分 
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()

數據合併之join

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

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()

索引和複合索引

簡單的索引操做:

  • 獲取index:df.index
  • 指定index:df.index = ['x, y']
  • 從新設置index:df.reindex(list("abcdef"))
  • 指定某一列做爲index:df.set_index("Country", drop=False)
  • 返回index的惟一值:df.set_index("Country").index.unique()

pandas時間序列

生成一段時間範圍

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 每個月第一個工做日

使用pandas提供的方法把時間字符串轉化爲時間序列

df["timeStamp"] = pd.to_datetime(df["timeStamp"], format="")
format參數大部分狀況下能夠不用寫,可是對於pandas沒法格式化的時間字符串,咱們可使用該參數,好比包含中文

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
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息