本次筆記內(nèi)容:
- data frame的行/列selection, index使用方法
- 對data frame中元素進(jìn)行批量操作(刪除行/列,基于其他列添加新列等)
首先需要將表格數(shù)據(jù)(.csv, .txt, .tab, .xls, 等)導(dǎo)入pandas進(jìn)行處理煮剧,導(dǎo)入時指定的參數(shù)不同咱筛,則其行列的index定義不同其爵,會對后續(xù)的行列selection造成影響咖耘。
以路徑/home/username/data/
下的file.csv
為例饭于,
import pandas as pd
df = pd.read_csv('/home/username/data/file.csv',sep='\t')
df.head(5)
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', index_col = 0, header = 0)
使用默認(rèn)參數(shù)得到的data frame為列名作為列的index, 行數(shù)作為行的index, 使用col_index = 0
則規(guī)定行名為第一列蜀踏,header = 0
則規(guī)定列名為第一行。以及header = None
指定沒有列名掰吕。output如下所示:
根據(jù)數(shù)據(jù)類型來選擇相應(yīng)的打開方式果覆,一般在數(shù)據(jù)分析之前,對數(shù)據(jù)進(jìn)行預(yù)處理殖熟,行為各樣本(sample)信息局待,列為各特征信息(feature)。
在使用df['']
這樣默認(rèn)方式選擇時菱属,需要注意:
df[' ']
是默認(rèn)選擇列
df['':'']
是默認(rèn)選擇行的slicing
import pandas as pd
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', col_index = 0, header = 0)
df1['S_0001']
df1['gender':'activity_time/h']
output如下所示钳榨。
data frame的行/列selection, index使用方法
- 使用
df.iloc
: 使用integer數(shù)字選擇行列 - 使用
df.loc
: 使用index/label行列名稱選擇 - 使用
df.ix
: 可以使用integer也可以使用index/label
1. 使用df.iloc
需要知道想要選擇的行列位置,如第幾列第幾行纽门。
import pandas as pd
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', col_index = 0, header = 0)
## 選擇規(guī)則: df.iloc[[用于選擇行的integer],[用于選擇列的integer]]
df1 = df1.iloc[[0,2],] # 選擇df1中的0薛耻、2兩行
df1 = df1.iloc[[0,2],1:] # 選擇df1中的0、2兩行赏陵,從第1列開始的后面所有列饼齿。注意使用:這樣的slicing則不用括在[]中
output如下所示:
2. 使用df.loc
data frame需要有index存在,因為它基于index來進(jìn)行選擇行列蝙搔。如果沒有缕溉,需要用.set_index
來設(shè)置index
df.set_index('col_name', inplace=True)
使用df.loc
來選擇行列,可以指定需要的行列名稱(index)來選擇吃型,也可以籍此設(shè)置一些選擇條件(邏輯語句:Boolean / Logical indexing )证鸥,用于初步篩選數(shù)據(jù)。例如選擇gender這個feature為M的所有數(shù)據(jù),選擇某個feature大于某個數(shù)字的所有數(shù)據(jù)等敌土。
import pandas as pd
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', col_index = 0, header = 0)
## 選擇規(guī)則: df.loc[[用于選擇行的index],[用于選擇列的label]]
df1 = df1.T # 處理成sample-行镜硕, feature--列的形式
df1 = df1.loc[['S_0001','S_0002'],'gender':] # 選擇df1中的S_0001,S_0002兩行(sample), 選擇gender及其后所有的列(feature)
print df1['gender']
df1.loc[df1['gender'] == 'M', 'smoking'] # 選擇feature為gender的samples, 查看feature中smoking的情況: 男性sample中吸煙狀況如何?
df1.loc[:,'S_0002':] # 選擇S_0002及其后所有的columns,注意冒號的使用
df[['S_0001','S_0002']] # 如果選擇多個不連續(xù)的column, 可以這樣選擇
list = ['S_0001','S_0002']
df[list] # 同上是一樣的結(jié)果
## 需要注意的是返干,如果在column的選擇中沒有使用list, 即str: 'smoking', 則得到的數(shù)據(jù)形式為Series.
## 如果使用list, ['smoking'], 則得到單列的data frame
output如下所示
3. 使用df.ix
只有當(dāng)data frame的index不是Integer的時候才可以使用兴枯,且其行列的指定可以為integer和index混合的。但是目前0.20.1版本之后的pandas都不再使用.ix
的用法了矩欠,integer和index還是各用各的選擇方法比較保險财剖。
import pandas as pd
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', col_index = 0, header = 0)
## 選擇規(guī)則: df.ix[[用于選擇行的integer/index],[用于選擇列的integer/index]]
df1.ix[['S_0001','S_0002'],'gender':]
df1.ix[[0,2],2:]
df1.ix[[0,2],'smoking':]
output如下所示
對data frame中元素進(jìn)行批量操作(加和,基于其他列添加新列等)
獲取行名(index),列名(columns)癌淮,并且查看Index的情況躺坟,如有無重復(fù)
刪除行/列
插入行/列
import pandas as pd
df1 = pd.read_csv('/home/username/data/file.csv', sep='\t', col_index = 0, header = 0)
df1.columns.tolist() # 獲取列名,轉(zhuǎn)化為List
df1.index.values # 獲取行名,轉(zhuǎn)化為numpy中的arrary
df1.index.has_duplicates # 行名是否有重復(fù)乳蓄。返回True/False
###刪除行/列###
df1.drop(['group','gender'], axis=0) # 按照row_name刪除行, 不加axis參數(shù)則默認(rèn)刪除行
df1.drop(['S_0001','S_0002'],axis=1) # 按照col_name刪除列
df1.drop(df1.index[[0,2]], axis=0) # 按照"第幾行咪橙?"刪除行,其row的index必須非0
df1.drop(df1.columns[[0,2]], axis=1) # 按照"第幾列虚倒?"刪除列美侦,其column的index必須非0
###更改行/列名###
df1.rename(index = {'sleep_score': 'sleep_hour', 'smoking': 'smoking_status'}, inplace= True)
# 更改行名: df.reanme(index = {'old_name':'new_name'},inplace= True)
df1.rename(columns = {'S_0001': 's_0001'}, inplace = True)
# 更改列名: 將index換為columns
###插入新的行/列###
## 比如要生成新的一列,根據(jù)sleep_score的數(shù)值魂奥,生成新的一列sleep_status. 規(guī)定低于8小時為short, 8小時為normal, 8小時以上為long.
#這里使用行為sample_id, 列為feature的df1
def sleep(i):
if float(i) < 8:
return 'short'
elif float(i) == 8:
return 'normal'
elif float(i) > 8:
return 'long'
else:
return 'others'
df1['sleep_status'] = df1['sleep_score'].apply(lambda x: sleep(x))
print df1
# df1['sleep_score'].apply(lambda x: sleep(x))基于df1['sleep_score'],apply sleep()函數(shù)菠剩,生成一個新的列
# (lambda x: sleep(x)) 即輸入?yún)?shù)為x, 返回sleep(x)值
output如下所示。(只是寫函數(shù)不想用ipython而已)
根據(jù)某一列數(shù)值來slicing dataframe
# 比方說p這個dataframe有一個column叫object, 現(xiàn)在要slicing出object在object_in這個List中的行
object_in = ["a" , "b" , "c", "d"]
p_selected = p.loc[p['object'].isin(object_in),:]
p_selected = p.loc[~p['object'].isin(object_in),:]
# 就是除了object_in之外的