文章目錄
0. 前言
- 參考《利用Python進行數據分析》第五章
- 相關源碼
- pandas中數據結構組要分爲
Series
和DataFrame
。
1. Series
1.1. 基本概念
由一組數據(各種Numpy數據類型)以及一組與之相關的數據標籤(即索引)組成。
1.2. 構造對象Series
# 默認索引爲數字,從0開始編號
obj = Series([4, 7, -5, 3])
# 指定索引
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
# 通過字典構建,key爲索引,value爲值
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = Series(sdata)
# 輸入字典,同時指定索引
# 索引中存在,字典中不存在的,值爲NA
# 索引中不存在,字典中存在的,忽略
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index=states)
1.3. 其他
- 對值可以直接進行類似Numpy的操作。
- 多個Series之間的操作,會在算術運算中自動對齊不同的索引的數據。
- 索引:修改索引可以直接通過賦值。如
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
name
屬性,與pandas中其他功能有很大聯繫。
2. DataFrame
2.1. 基本概念
- 包含一組有序的列(Series對象),每列可以是不同的數值類型。
- 既包含行索引又包含列索引。
- 常用屬性:
T
axes
:查看行索引與列索引info()
:基本信息
2.2. 構建對象
# 通過字典構建
# key爲列索引,value爲值(可以是列表或numpy對象,要求長度一樣)
# 默認行索引爲數字,從0開始編號
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
# 可以指定列索引
# 如果索引不存在,則該行爲NaN
frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five'])
# 通過嵌套字典構建
# 外層字典的key爲列索引,內層字典的key爲行索引
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = DataFrame(pop)
# 其他
# 二維ndarray(可添加行、列索引)
# 數組、列表、元組 組成的字典。
# numpy結構化數組
# Series字典
# 嵌套字典
# 字典或Series的列表
# 列表或字典組成的列表
# 另一個DataFrame
2.3. 行
- 查看行索引/行名稱:
df.index
- 普通查詢(獲取單行或多行信息)
- 獲取的結果是行對象,而不是Series。
# 切片獲取,不能使用單個數字
frame[1:4]
# frame[1] # error
# irow + 行號,只能獲取單行
frame.irow(0)
# iloc + 行號,可同時指定列,行列都使用切片編號
# 使用切片時不包含`end`
frame.iloc[1] # 第一行
frame.iloc[:10]
frame.iloc[:, 0] # 第一列
frame.iloc[:10, 5:]
# loc + 索引,可同時指定列,行列都使用索引
# 使用切片時包含`end`
# 類似numpy操作,其中`start:end`是包含`end`的,且取值不一定是整數
frame.loc['row_index']
frame.loc[['row_index1', 'row_index_2']]
frame.loc[:, 'column_index']
frame.loc[:, ['column_index_1', 'column_index_2']]
frame.loc[['row_index1', 'row_index_2'], ['column_index_1', 'column_index_2']]
- 查詢行數:
len(df.index)
,len(df)
- 查詢前/後幾行:
df.head(i), df.tail(i)
- 行過濾(根據條件刪除行)
# 單條件過濾,使用df[cond]的形式,cond爲bool類型,用於篩選行
df = df[df.age > 10]
df = df[df['age'] > 10]
# 多條件過濾,使用&來連接多個不同條件
df = df[df.age > 10 & df.salary > 1000.]
- 將行隨機轉換爲幾個子集(切割dataframe)
# 如果只要隨機獲取一定比例的樣本,可以通過 sample
df.sample(frac=0.5)
# 假設要把df轉換爲train/val/test,分別是0.8/0.1/0.1的比例,則
num_train = int(len(df)*0.8)
num_val = int(len(df)*0.1)
num_test = len(df) - num_train - num_val
df = df.sample(frac=1.0) # shuffle
train_df = df[:num_train]
val_df = df[num_train:(num_train+num_val)]
test_df = df[:-num_test]
- 增
# 通過loc指定新的行索引,增加行
# 這種方式可以不管類型,直接賦值
df.loc['new_raw_index'] = 1 # 不管數據類型,行所有的數據都爲1
df.loc['new_raw_index'] = {'a': 1, 'b': 'two'} # 必須指定所有列,否則報錯
# append
# 傳入的必須是Series對象、字典、字典列表
df = df.append({'a': 5}, ignore_index=True)
- 遍歷行
for row in df.iterrows():
# row 是個元組,包含快兩個數據
# row[0] 應該是行索引
# row[1] 是個 Series 對象,可以直接通過 row[1].column_name 來獲取數據
pass
- 根據行id刪除行:
df.drop([0, 5])
- 刪除重複行:
df.drop_duplicates([0, 5])
,其中選擇的是列名,即df.columns
中內容
2.4. 列
- 查列索引/列名稱:
df.columns
- 查一列或多列
# 通過字典或屬性的方式,獲取列對象(Series)
frame2['year']
frame2.year
# 通過icol獲取單列(Series)
frame.icol(0)
# 獲取多列(DataFrame)
frame[['w']]
frame[['w', 'z']]
- 改
- 可以通過賦值直接修改列的值。要求是標量,或長度與DataFrame匹配。
- 增
- 對不存在的列賦值,會創建列。
- 刪
- 刪除列通過
del
實現,如del frame2['tes']
- 通過
drop
實現,如df.drop([1, 2], axis=1)
,其中選擇的是列名,即df.columns
中內容。
- 刪除列通過
- 列數:
df[0].count()
2.5. 其他操作
- 轉置,如
frame.T
- 獲取行與列:
df.shape
- 替換NAN爲0:
df..fillna(0)
- 兩個DataFrame拼接成一個:
df.concat([df1, df2])
3. 其他
3.1. 讀取文件
# 普通讀取
df = pd.read_csv(FILE_PATH)
# 默認情況下,認爲文件第一行爲Header,即列名
# 如果第一行不是列名,則需要設置 header 爲None,如下所示
df = pd.read_csv(FILE_PATH, header=None)
# 默認情況下,文件中沒有索引(即行名)
# 如果要設置第一列爲行名,可以設置 index_col
df = pd.read_csv(FILE_PATH, index_col=0)
# 如果第一行不是列名,則需要設置 header 爲None,如下所示
df = pd.read_csv(FILE_PATH, header=None)
# 分塊讀取並且遍歷,chunksize代表每次讀取的行數量
df = pd.read_csv(FILE_PATH, chunksize=1000)
for piece in df:
# piece 可以作爲 DateFrame 操作
...
# 讀取開頭若干行數據,讀取前1000行
df = pd.read_csv(FILE_PATH, nrows=1000)
3.2. 寫文件
train_df.to_csv('/path/to/target.csv',
sep=',', # 分隔符
na_rep='', # 缺失數據補全
float_format=None, # C語言格式的浮點數格式,如'%10.5'
columns=None, # 要保存的列,看到舉例使用的是列名
header=True, # 列名展示,可以是True/False,也可以輸入list來指定列名
index=True, # 是否打印行名
encoding='utf8', # 編碼
)
# 如果在指定了 float_format 後部分整數也有小數部分,可以先將對應列轉換類型,例如
df[['cycle', 'passs', 'ip']]=df[['cycle', 'passs', 'ip']].astype(int64)