pandas稍微比numpy處理數據起來仍是要慢一點,pandas呢是numpy的升級版,能夠說各有所長,numpy的優點是用來處理矩陣,而pandas的優點是處理數表。app
1. Series 線性數表ide
serier一個線性數表,所謂線性數表就是他的數據比較單一,沒有那麼多的分類要麼行爲1要麼列爲1spa
一般serier咱們用來自動生成數表的列啊,行啊什麼的excel
import pandas as pd import numpy as np s = pd.Series([1,3,6,np.nan,44,1]) print(s) """ 0 1.0 1 3.0 2 6.0 3 NaN 4 44.0 5 1.0 dtype: float64 ""
2.DataFrame code
dataframe是一個支持行索引和列索引的這麼一個大型的數表blog
df2 = pd.DataFrame({'A' : 1., 'B' : pd.Timestamp('20130102'), 'C' : pd.Series(1,index=list(range(4)),dtype='float32'), 'D' : np.array([3] * 4,dtype='int32'), 'E' : pd.Categorical(["test","train","test","train"]), 'F' : 'foo'}) print(df2) """ A B C D E F 0 1.0 2013-01-02 1.0 3 test foo 1 1.0 2013-01-02 1.0 3 train foo 2 1.0 2013-01-02 1.0 3 test foo 3 1.0 2013-01-02 1.0 3 train foo """
dataframe的簡單操做, 排序
df1 = pd.DataFrame(np.arange(12).reshape((3,4)))
1.查看數表的某一列的每一個元素的類型索引
print(df2.dtypes)
2.查看全部的行input
print(df2.index)
3.查看全部的列pandas
print(df2.columns)
4.查看全部的值
print(df2.values)
5.查看全部數據的總結
print(df.describe)
6.若是想對數據的 index
進行排序並輸出
print(df2.sort_index(axis=1, ascending=False))
7.若是是對數據 值 排序輸出:
print(df2.sort_values(by='B'))
8.轉置 T
dataframe的增刪改查
1.查
查呢有四種方式能夠查看,一種就是和list通常直接在list後加上[ ]引用便可,而後就是loc,iloc,ix
loc就要求引用的索引是名字,iloc是序號,而ix二者均可
shubiao = pd.DataFrame(np.arange(24).reshape((6, 4)), index=date, columns=['A', 'B', 'C', 'D']) print(shubiao) print(shubiao[:'20160208']['A']) # loc純標籤 print(shubiao.loc[:, 'A': 'B']) # 先後就均可以用了 前行後列 # iloc 純數字下標 print(shubiao.iloc[0:5, 0:2]) # 因而可知的 標籤來引用彷佛不知足左閉右開 前行後列 # ix loc與iloc的混合版 print(shubiao.ix[0:3, 'A': 'B']) # 混合版哦 前行後列
2.改
改其實和查是同樣的,只不過加上等於便可
3.刪
咱們要執行刪除某行某列操做的時候就須要該行該列存在numpy的NaN元素,這時候咱們就能夠執行刪除操做
# 直接去掉有 NaN 的行或列 shubiao.dropna(axis=0, how='any') # 0 - 對行操做,1 - 對列操做。any - 只要有則刪除, all - 全都是則刪除 # 將 NaN 的值用其餘值代替, 好比代替成 0: shubiao.fillna(value=0) # 判斷是否有缺失數據nan 爲 True 表示缺失數據 shubiao.isnull() # 按照相應的位置返回true or false # 檢測在數據中是否存在 NaN, 若是存在就返回 True: print(np.any(shubiao.isnull()) == True)
4.增
shubiao.loc['2016-02-14'] = 0 # 增長一行 若是數表以前就有初始index就必定要loc若是沒有就能夠iloc shubiao['lpo'] = 0 # 增長一列 值爲0
合併
concat合併
# 合併 concat df = pd.DataFrame(np.arange(12).reshape((3, 4)), columns=['A', 'B', 'C', 'D'], index=[1, 2, 3]) df2 = pd.DataFrame(np.arange(12, 24).reshape((3, 4)), columns=['A', 'B', 'C', 'D'], index=[2, 3, 4]) # 合併第一種狀況 列都相同 和並行(上下合併) res = pd.concat([df, df2], axis=0) print(res) # A B C D # 1 0 1 2 3 # 2 4 5 6 7 # 3 8 9 10 11 # 2 12 13 14 15 # 3 16 17 18 19 # 4 20 21 22 23 # 由此能夠看出咱們按照行合併的 可是index卻並無自動排序 # 第二種 忽略 index排序 (忽略index生成的res就會本身生成新的index) res = pd.concat([df, df2], axis=0, ignore_index=True) # ignore_index改成Ture 便可 print(res) # A B C D # 0 0 1 2 3 # 1 4 5 6 7 # 2 8 9 10 11 # 3 12 13 14 15 # 4 16 17 18 19 # 5 20 21 22 23 # 第三種 但實際上不少時候咱們是column是不一樣的,那咱們要合併改怎麼合併呢? df3 = pd.DataFrame(np.arange(12, 24).reshape((3, 4)), columns=['B', 'C', 'D', 'E'], index=[2, 3, 4]) res = pd.concat([df, df3], axis=0) print(res) # A B C D E # 1 0.0 1 2 3 NaN # 2 4.0 5 6 7 NaN # 3 8.0 9 10 11 NaN # 2 NaN 12 13 14 15.0 # 3 NaN 16 17 18 19.0 # 4 NaN 20 21 22 23.0 可是已經爆紅了可是結果仍是出來了,是由於咱們這樣合併少了一個參數join res = pd.concat([df, df3], axis=0, ignore_index=True, join='outer', sort=True) # join有兩種參數 outer 與inner # 這裏要加上sort=True 是由於: # FutureWarning: Sorting because non-concatenation axis is not aligned. A future version # of pandas will change to not sort by default. # # To accept the future behavior, pass 'sort=False'. # # To retain the current behavior and silence the warning, pass 'sort=True'. print(res) # A B C D E # 0 0.0 1 2 3 NaN # 1 4.0 5 6 7 NaN # 2 8.0 9 10 11 NaN # 3 NaN 12 13 14 15.0 # 4 NaN 16 17 18 19.0 # 5 NaN 20 21 22 23.0 # 沒有的變爲nan代替 res = pd.concat([df, df3], join='inner', axis=0, ignore_index=True, sort=True) print(res) # B C D # 0 1 2 3 # 1 5 6 7 # 2 9 10 11 # 3 12 13 14 # 4 16 17 18 # 5 20 21 22 把相同column 組合了 # 按照某一個df特定 index或者column 合併(也就是說這個df的column,和index 不會變 合併的那個相同的纔會合併,沒有的補nan) # 如果按照index 這column不一樣的會疊加 # 按照df.index合併 res = pd.concat([df, df3], join_axes=[df.index], ignore_index=True, sort=True, axis=1) print(res) # 0 1 2 3 4 5 6 7 # 1 0 1 2 3 NaN NaN NaN NaN # 2 4 5 6 7 12.0 13.0 14.0 15.0 # 3 8 9 10 11 16.0 17.0 18.0 19.0 # append 疊加(注疊加後自己沒有變須要用一個變量來接受他) res = df.append([df2, df3], ignore_index=True, sort=True) # df若要「擴大」就必需要sort=True print(res) # A B C D E # 0 0.0 1 2 3 NaN # 1 4.0 5 6 7 NaN # 2 8.0 9 10 11 NaN # 3 12.0 13 14 15 NaN # 4 16.0 17 18 19 NaN # 5 20.0 21 22 23 NaN # 6 NaN 12 13 14 15.0 # 7 NaN 16 17 18 19.0 # 8 NaN 20 21 22 23.0
merge合併
right = pd.DataFrame({'key': ['k0', 'k2', 'k2'], 'key1': ['K00', 'K22', 'K22'], 'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3']}) left = pd.DataFrame({'key': ['k1', 'k2', 'k3'], 'key1': ['K11', 'K22', 'K33'], 'C': ['C1', 'C2', 'C3'], 'D': ['D1', 'D2', 'D3']}) print(right) ''' key key1 A B 0 k0 K00 A1 B1 1 k2 K22 A2 B2 2 k2 K22 A3 B3 ''' print(left) ''' key key1 C D 0 k1 K11 C1 D1 1 k2 K22 C2 D2 2 k3 K33 C3 D3 ''' # 基礎的合併 若參數是outer 則先排left,在排right裏面多餘的,如果inner則合併相同的, right就是以right的爲基準沒有補nan,left亦然 res = pd.merge(left, right, how='left', on='key') # how = ['left', 'right', 'outer', 'inner'] print(res) ''' key key1_x C D key1_y A B 0 k1 K11 C1 D1 NaN NaN NaN 1 k2 K22 C2 D2 K22 A2 B2 2 k2 K22 C2 D2 K22 A3 B3 3 k3 K33 C3 D3 NaN NaN NaN ''' res = pd.merge(left, right, how='outer', on=['key', 'key1']) print(res) ''' key key1 C D A B 0 k1 K11 C1 D1 NaN NaN 1 k2 K22 C2 D2 A2 B2 2 k2 K22 C2 D2 A3 B3 3 k3 K33 C3 D3 NaN NaN 4 k0 K00 NaN NaN A1 B1 ''' # 因而可知 遍歷順序是由 left來決定的 # indicator 會將合併信息放一邊 # 例如 res = pd.merge(left, right, how='outer', on=['key', 'key1'], indicator=True) print(res) ''' key key1 C D A B _merge 0 k1 K11 C1 D1 NaN NaN left_only 1 k2 K22 C2 D2 A2 B2 both 2 k2 K22 C2 D2 A3 B3 both 3 k3 K33 C3 D3 NaN NaN left_only 4 k0 K00 NaN NaN A1 B1 right_only # only是由於沒有的數據補了nan ''' # 按照index合併 相似於pd.concat(join_axes=right.index) #依據左右資料集的index進行合併,how='outer',並打印出 right = pd.DataFrame({'key': ['k0', 'k2', 'k2'], 'key1': ['K00', 'K22', 'K22'], 'A': ['A1', 'A2', 'A3'], 'B': ['B1', 'B2', 'B3']}, index=['w', 's', 'd']) left = pd.DataFrame({'key': ['k1', 'k2', 'k3'], 'key1': ['K11', 'K22', 'K33'], 'C': ['C1', 'C2', 'C3'], 'D': ['D1', 'D2', 'D3']}, index=['w', 'a', 'd']) print(right) ''' key key1 A B w k0 K00 A1 B1 s k2 K22 A2 B2 d k2 K22 A3 B3 ''' print(left) ''' key key1 C D w k1 K11 C1 D1 a k2 K22 C2 D2 d k3 K33 C3 D3 ''' res = pd.merge(left, right, how='inner', left_index=True, right_index=True) print(res) # key_x key1_x C D key_y key1_y A B # w k1 K11 C1 D1 k0 K00 A1 B1 # d k3 K33 C3 D3 k2 K22 A3 B3 # 解決overlapping的問題 res = pd.merge(left, right, how='inner', left_index=True, right_index=True, suffixes=['_boy', '_girl']) print(res) # key_boy key1_boy C D key_girl key1_girl A B # w k1 K11 C1 D1 k0 K00 A1 B1 # d k3 K33 C3 D3 k2 K22 A3 B3
導入
import numpy as np import pandas as pd import xlrd import openpyxl class_one = pd.read_excel(r'C:\Users\Book\Desktop\calss_one.xlsx') print(class_one) dao = int(input('學號:')) # --------------------------------------------------------------------------------------------------------------------- number = class_one['學號'][class_one['學號'] == dao] # 至關於我先選中了列的全部的值 而後選擇了 # class_one['學號'] == 20170200334爲真的一部分 返回這個值的全部屬性x 是一維的series print('--', number.index)
導出
import numpy as np import pandas as pd import xlrd import openpyxl time_data = pd.date_range('20190101', periods=6) # ['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04', # '2019-01-05', '2019-01-06'] column_time = ['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04','2019-01-05', '2019-01-06'] df = pd.DataFrame(np.NaN, columns=column_time) print(df) df.to_excel(r'C:\Users\Book\Desktop\calss_one.xlsx')
這是個人一些經驗
A B C D
2016-02-08 0 1 2 3
2016-02-09 4 5 6 7
2016-02-10 8 9 10 11
2016-02-11 12 13 14 15
2016-02-12 16 17 18 19
2016-02-13 20 21 22 23
1.彷佛pandas的不支持列的範圍查找, 只能每一行查找。
也就是說data[0] 或者data['A']是正確的,
而data[0: 3]就會查找到是第一行到第三行而不是列
data['A': 'C']就是錯誤的
2.貌似pandas的行選擇查找不知足左閉右開
data[0:3]是第一行到第三行沒錯
data['2016-02-08': '2016-02-10'] 2016-02-10一行也顯示了
data['2016-02-08'] 也是錯誤的
data[:'2016-02-08'] 纔是正確的
data['2016-02-08']['A']是能夠的
data['2016-02-08']['A', 'B']是錯誤的
也就是說每一行是有序的,可是每一列是獨立的 直接所引列就是不能超過一個,直接索引行,就是不能單獨一個
由於他把單個索引的給了列,把順序索引給了行。
好了