1. 程式人生 > >Pandas個人操作練習(1)建立dataframe及插入列、行操作

Pandas個人操作練習(1)建立dataframe及插入列、行操作

個人分類: Python 使用pandas之前要匯入包:

import numpy as np

import pandas as pd

import random #其中有用到random函式,所以匯入

一、dataframe建立 pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

data:numpy ndarray(結構化或同類),dict或DataFrame,Dict可以包含Series,陣列,常量或類似列表的物件

index:dataframe的索引,如果沒有自定義,則預設為RangeIndex(0,1,2,…,n)

columns:dataframe的列標籤,如果沒有自定義,則預設為RangeIndex(0,1,2,…,n)

dtype:預設None,要強制的資料型別。 只允許一個dtype

copy:boolean,預設為False

(1)利用randn函式用於建立隨機數來快速生成一個dataframe,可以將下句這一部分np.random.randn(8,5)作為引數data,其他預設,可以看到索引和列名都為(0,1,2,,,n),可以看出dataframe最不能缺少的為data

df = pd.DataFrame(np.random.randn(8,5))

(2)用字典dict來生成一個dataframe

data = {‘BoolCol’: [1, 2, 3, 3, 4], ‘attr’: [22, 33, 22, 44, 66], ‘BoolC’: [1, 2, 3, 3, 4], ‘att’: [22, 33, 22, 44, 66], ‘Bool’: [1, 2, 3, 3, 4] } df = pd.DataFrame(data)

(2).1自定義索引的dataframe

data = {‘BoolCol’: [1, 2, 3, 3, 4], ‘attr’: [22, 33, 22, 44, 66], ‘BoolC’: [1, 2, 3, 3, 4], ‘att’: [22, 33, 22, 44, 66], ‘Bool’: [1, 2, 3, 3, 4] } df = pd.DataFrame(data,index=[10,20,30,40,50])

或者這樣自定義索引

data = {‘BoolCol’: [1, 2, 3, 3, 4], ‘attr’: [22, 33, 22, 44, 66], ‘BoolC’: [1, 2, 3, 3, 4], ‘att’: [22, 33, 22, 44, 66], ‘Bool’: [1, 2, 3, 3, 4] } index = pd.Index(data=[10,20,30,40,50],name=“self_index”) df = pd.DataFrame(data,index=index)

(3)可以看出像列名‘att’等對應的都是一個list的形式,為例填充這些列名對應的值,首先要把值的形式定義好,形成list

#隨機生成3000個test號 #random.sample(range(0,10),6)從0-9這十位數中隨機選出6位 test_list=[] for i in range(3000): test_list.append(“123456”+"".join(str(s) for s in random.sample(range(0,10),6))) #生成3000個1-200的隨機浮點數,且保留兩位小數 test_list2 = [round(random.uniform(1,200),2) for _ in range(3000)] data = { ‘date’:pd.date_range(“2000”,freq= ‘Y’,periods=16).year, ‘aa’:test_list, ‘test2’:test_list2, ‘label’:[random.randint(0,1) for _ in range(3000)] } df = pd.DataFrame(data = data) 二、dataframe插入列 新增一列資料,,把dataframe如df1中的一列或若干列加入另一個dataframe,如df2 思路:先把資料按列分割,然後再把分出去的列重新插入 df1 = pd.read_csv(‘example.csv’) (1)首先把df1中的要加入df2的一列的值讀取出來,假如是’date’這一列 date = df1.pop(‘date’) (2)將這一列插入到指定位置,假如插入到第一列 df2.insert(0,‘date’,date) (3)預設插入到最後一列 df2[‘date’] = date

三、dataframe插入行 插入行資料,前提是要插入的這一行的值的個數能與dataframe中的列數對應且列名相同,思路:先切割,再拼接。 假如要插入的dataframe如df3有5列,分別為[‘date’,‘spring’,‘summer’,‘autumn’,‘winter’], (1)插入空白一行 方法一:利用append方法將它們拼接起來,注意引數中的ignore_index=True,如果不把這個引數設為True,新排的資料塊索引不會重新排列。

insertRow = pd.DataFrame([[0.,0.,0.,0.,0.]],columns = [‘date’,‘spring’,‘summer’,‘autumne’,‘winter’]) above = df3.loc[:2] below = df3.loc[3:] newData = above.append(insertRow,ignore_index=True).append(below,ignore_index=True)

方法二:用.concat()的方法來進行拼接,注意ignore_index=True

newData2 = pd.concat([above,insertRow,below],ignore_index = True) (2)假設df4中的列數和df3相同,取df4的行插入df3中

df4 = pd.DataFrame({‘BoolCol’: [1, 2, 3, 3, 4], ‘attr’: [22, 33, 22, 44, 66], ‘BoolC’: [1, 2, 3, 3, 4], ‘att’: [22, 33, 22, 44, 66], ‘Bool’: [1, 2, 3, 3, 4] }, index=[10,20,30,40,50])

data = { ‘date’:pd.date_range(“2000”,freq= ‘Y’,periods=16).year, ‘spring’:[random.uniform(12,15) for _ in range(16)], ‘summer’:[random.uniform(16,18) for _ in range(16)], ‘autumn’:[random.uniform(12,19) for _ in range(16)], ‘winter’:[random.uniform(11,15) for _ in range(16)] } df3 = pd.DataFrame(data=data) cols = [‘date’,‘spring’,‘summer’,‘autumn’,‘winter’] #df3 = df3.ix[:,cols] df3 = df3.loc[:,cols]

<1>.先獲取取某一行的索引:

insertRow2_index = df4[df4.Bool == 3].index.tolist()

<2>.根據索引獲取這兩行的值:

insertRow2 = [] for x in insertRow2_index: #注意.values的使用,只獲取值,不帶列名 insertRow2.append(df4.loc[x].values) insertRow22 = pd.DataFrame(insertRow2) #修改列名簡單粗暴的方法,要改就全改,否則不成功 insertRow22.columns=[‘date’,‘spring’,‘summer’,‘autumn’,‘winter’]

#靈活修改列名方法,可以選擇,預設列名為(1,2,,,n) insertRow22.rename(columns={‘1’:‘date’, ‘2’:‘spring’,‘3’:‘summer’, ‘4’:‘autumn’,‘5’:‘winter’}, inplace = True) 根據索引取得這一行的值的不同用法 (1)#根據自定義的index取一行資料,即用於標籤索引 1.1 #row = df4.loc[insertRow2_index] 1.2 row = df4.loc[insertRow2_index,:].values

-------------------------------------
(2)#根據系統預設的index取一行資料,即用於位置索引
row= df4.iloc[insertRow2_index,:].values

<3>.將insertRow22插入df3:

above = df3.loc[:2] below = df3.loc[3:] newData = above.append(insertRow22,ignore_index=True).append(below,ignore_index=True)