pandas操作
目錄
?pandas常用操作
1 生成Series、DataFrame對象、轉(zhuǎn)置、查看統(tǒng)計(jì)、類別
2? 利用ndarray、Series創(chuàng)建DataFrame
3? ?取首部head()和尾部tail()
4? ?新增行或列
5? ?修改行名(索引)和列名?
?7? DataFrame、Series和numpy相互轉(zhuǎn)換
8? 排序
? 1、按索引排序后(按軸)
? 2、按某一列值排序(按值排序)
9? 數(shù)據(jù)選擇
? ? 1、選擇某一列
? ? 2、切片(只能按行切)
? ? 3、按行名(索引)或列名選擇
? ? 4、按位置選擇
? ??5、布爾索引
? ? ? ? 1、用列條件選擇數(shù)據(jù)
? ? ? ? 2、用全局條件選擇數(shù)據(jù),
? ? ? ? 3. 用isin()篩選
10? ?賦值?
1、按位置賦值
2、用where條件賦值
11? Series、DataFrame對象追加和拼接
12? 文件輸入/輸出
1. 讀取.csv、.txt、.xlsx文件(需要安裝openpyxl庫)
? ? ?1.1?文件沒有列名:
? ? ?1.2文件有列名:
2. 寫入csv、txt、xlsx文件
3. 讀取和寫入HDF5(需要裝table庫?)
?pandas常用操作
?
1 生成Series、DataFrame對象、轉(zhuǎn)置、查看統(tǒng)計(jì)、類別
s = pd.Series([1, 3, 5, np.nan, 6, 8])- index代表行(索引)的名稱,columns代表列的名稱
df = pd.DataFrame(np.random.randn(6, 4), index=None, columns=list('ABCD'))
-
快速查看統(tǒng)計(jì):
- ?轉(zhuǎn)置
- 查看類別
- ?顯示索引和列名
2? 利用ndarray、Series創(chuàng)建DataFrame
- df = pd.DataFrame(pd.Series(['A', 'B', 'C']))
- df = pd.DataFrame({'A': 1,'B': pd.Series([1, 3, 5, np.nan, 6], dtype=np.float32),'C': np.array([2, 3, 4, 5, 6], dtype=np.float32),'D': pd.Categorical(['test', 'train', 'test', 'train', 'test']),'E': 'fool','F': 'nice'})
3? ?取首部head()和尾部tail()
?
df.head() #輸出數(shù)據(jù)的前五行 df.head(3) #輸出數(shù)據(jù)的前三行 df.tail(3) #輸出數(shù)據(jù)的后三行 df.tail() #輸出數(shù)據(jù)的后五行4? ?新增行或列
#添加一行或多行數(shù)據(jù) df2=df.append(df1_new, ignore_index=True) #ignore_index=True,表示不按原來的索引,從0開始自動(dòng)遞#增#添加一列 df['F'] = np.array([1,2, 3]) #在df末尾新增一列,列名為F#添加多列,可以用concat()增加,但是只能加在末尾,而reindex可以添加在任何位置#重新索引,加入原數(shù)據(jù)只要a,b兩列,下面代碼是加入c, d兩列, 這兩列的值都是10。輸出順序可以隨意更改, df = df.reindex(columns=['a', 'c', 'b', 'd'], fill_value = 10)5? ?修改行名(索引)和列名?
? ? ?行名和列名如果都沒賦值,默認(rèn)都是0開始計(jì)數(shù)
-
注意:創(chuàng)建一個(gè)DataFrame,不指定行名和列名,默認(rèn)都是0計(jì)數(shù)
- 修改方式如下:
??????6、刪除某一列或某一列
#下面兩個(gè)方式等價(jià) df.drop(columns=['B', 'C']) df.drop(['B', 'C'], axis=1)#刪除某行,下面兩個(gè)等價(jià) df.drop([0, 1]) df.drop(index=[0, 1])?7? DataFrame、Series和numpy相互轉(zhuǎn)換
#pandas轉(zhuǎn)numpy, 下面四種轉(zhuǎn)換等價(jià),輸出不帶行名和列名。這里的df可以是Series或DataFrame df.to_numpy(np.int64) #可以修改數(shù)據(jù)類型 df.values np.array(df)#numpy數(shù)組轉(zhuǎn)DataFrame df = pd.DataFrame(data)#numpy轉(zhuǎn)Series df = pd.Series(np.array([1,2,3])) #必須是一維的ndarray,不能是多維8? 排序
-
? ?原數(shù)據(jù), 下面幾個(gè)例子也是這個(gè)數(shù)據(jù)
? 1、按索引排序后(按軸)
df.sort_index(axis=0, ascending=False) #按行名的大小排序? 2、按某一列值排序(按值排序)
df.sort_values(by='c') #按列名為‘c’的值排序9? 數(shù)據(jù)選擇
? ? 1、選擇某一列
df['a'] #輸出行名為a的全部列值? ? 2、切片(只能按行切)
? ? ? 下面兩個(gè)效果一樣
df[0:2] #輸出前兩行 df['A': 'B'] #按行名輸出前兩行? ? 3、按行名(索引)或列名選擇
df.loc['A'] #輸出一行df.loc['A', 'a'] #輸出行名為A的a列,標(biāo)量 df.at['A', 'a'] #跟上一個(gè)等價(jià)df.loc['A', ['a', 'b']] #只輸出行名為A, 的a, b兩列的值 df.loc[:, ['a', 'b', 'c']] #輸出全部行的a, b, c三列的值 df.loc['A': 'B', ['a', 'd']] #輸出A到B行的a和d列? ?4、按位置選擇
df.iloc[2] #輸出第三行,位置從0行算起 df.iloc[:,2] #輸出第三列, 位置從0列算起 df.iloc[0:2, 1:3] #類似numpy切片,輸出(0、1)行(1、2)列 df.iloc[1, 1] #輸出第2行第2列的值df.iat[1,1] #快速訪問標(biāo)量,輸出第2行第2列的值,與上一個(gè)等價(jià)? ?5、布爾索引
? ? ? ? 1、用列條件選擇數(shù)據(jù)
df[df['a'] >= 10] #輸出滿足a列值》=10的行數(shù)據(jù)?
? ? ? ? 2、用全局條件選擇數(shù)據(jù),
? ? ? ? ? ? ? ? ? 不滿足的變?yōu)閚an
df[df>2] #不大于2的值被變?yōu)閚an? ? ? ?3. 用isin()篩選
df[df['d'].isin([4, 11])] #輸出d列的值在[4, 11]內(nèi)的行10? ?賦值?
1、按位置賦值
df.iloc[1, 1] =1000?
2、用where條件賦值
df[df>0] = -df #df中大于0的值全部變?yōu)樨?fù)值11? Series、DataFrame對象追加和拼接
#追加行數(shù)據(jù),可以是Series或DataFrame df.append(pd.Series(np.array([1,2,3,4])), ignore_index=True) #拓展一行Series df.append(df1, ignore_index=True) #拓展一個(gè)df1,直接將接在df后面,算做df的行 #拼接 pd.concat([df1,df2, df3], axis=1)#axis默認(rèn)是0, 在0軸上合并。12? 文件輸入/輸出
1. 讀取.csv、.txt、.xlsx文件(需要安裝openpyxl庫)
pd.read_csv(filepath_or_buffer, sep=',',header=0, names=None,dtype=None, nrows=None,encoding=None等等)filepath_or_buffer:文件所在處的路徑
sep:指定分隔符,默認(rèn)為逗號(hào)','
header:?指定第幾行作為列名,如果沒有指定列名,默認(rèn)header=0; 如果數(shù)據(jù)本身不存在列名,就用header=None
names:指定列的名稱,用列表表示。一般我們沒有表頭,即header=None時(shí),這個(gè)用來添加列名就很有用啦!
dtype:?? 指定數(shù)據(jù)類型? 例如{‘a(chǎn)’: np.float64, ‘b’: np.int32}
nrows?: int, 需要讀取的行數(shù)(從文件頭開始算起)
encoding: 亂碼的時(shí)候用這個(gè)
例子如下:
''' 讀取test.csv, 以逗號(hào)識(shí)別,不存在列名,加列名0到64,將列名2的數(shù)據(jù)轉(zhuǎn)成float32, 輸出五行,編碼為utf-8 ''' pd.read_csv('./data/test.csv', sep=',', header=None, names=range(65),dtype={2: np.float32}, nrows=5,encoding='utf-8')? ? 1.1?文件沒有列名:
? ? ? ? ?即第一就是數(shù)據(jù),讀取方式如下,這樣讀取后的列名就是系統(tǒng)默認(rèn)的0,1,2...?
#自動(dòng)加上列名,0開始計(jì)數(shù) df = pd.read_csv('test.csv', header=None)#添加列名 df.columns = ['A', 'B','C'] #實(shí)際就是列名修改,但是需要提供全部列名#讀取時(shí)就添加列名 df = pd.read_csv('./data/test.csv', header=None, names=['A', 'B','C'])? ?1.2文件有列名:
import pandas as pd#使用數(shù)據(jù)的列名 df = pd.read_csv('./data/test.csv') # 等價(jià) df = pd.read_csv('./data/test.csv', header=0)#讀取時(shí),修改成自己的列名 df_example = pd.read_csv('Pandas_example_read.csv', names=['A', 'B','C']) pd.read_csv('./data/foo.csv') pd.read_csv('./data/foo.txt') pd.read_csv('./data/foo.xlsx')2. 寫入csv、txt、xlsx文件
格式:
pd.to_csv(path_or_buf=None,? sep=',' , na_rep='', float_format=None, columns=None, header=True, index=True,?等等.....)參數(shù)非常多,常用的幾個(gè)參數(shù)如下:
filepath_or_buffer:? 即文件保存路徑
sep:? 指定分隔符,默認(rèn)為逗號(hào)','? ?例:sep = '?'
na_rep:字符串,將NaN轉(zhuǎn)換為特定值? 例:na_rep =? 'abc'
float_format: 數(shù)據(jù)格式,格式是None, 例:float_format='%.2f'
columns:保存哪些列,默認(rèn)是所有類都保存, 例:columns = ['a', 'b'],只保存a, b列
header='True':? 是否寫入列名,默認(rèn)是True
index:是否寫入行名(索引),默認(rèn)是True
例子如下:
df.to_csv('./fool.csv') df.to_excel('./fool.xlsx')''' pandas寫入test.csv中,用問號(hào)進(jìn)行分割,nan值被替換成123, 寫入格式是小數(shù)點(diǎn)后兩位數(shù),只寫入c, a, b三列, 不寫入列名,不寫入行名(索引) ''' df.to_csv(path_or_buf='./data/test.csv', sep='?', na_rep='123', float_format='%.2f', columns=['c', 'a', 'b'], header=True, index=False)3. 讀取和寫入HDF5(需要裝table庫?)
pip install --user tables #如果是pip命令用這個(gè) conda install pytables #如果是conda命令用這個(gè)#讀取hdf5 df = pd.read_hdf('fool.h5')#寫入hdf5 df.to_hdf('fool', 'df')? ? ? ?
下篇博客:機(jī)器學(xué)習(xí)數(shù)據(jù)處理
?
總結(jié)
- 上一篇: numpy实现神经网络代码(mnist手
- 下一篇: (一)机器学习数据处理