pandas簡(jiǎn)單的使用

生成對(duì)象和獲取對(duì)象的基本信息

pandas中DataFrame生成對(duì)象。

“我”定義的名字

對(duì)于屬性和索引直接為空的對(duì)象,直接傳入矩陣即可。

對(duì)于要指定索引和屬性的數(shù)據(jù),需要傳入對(duì)應(yīng)參數(shù):

df = pd.DataFrame(data,index=indexs,columns=list("ABCD"))

當(dāng)簡(jiǎn)單做測(cè)試的時(shí)候,可以用字典進(jìn)行生成對(duì)象:

data = {'a':[1,2,3], 'b':[2,3,4], 'c':[3,4,5]}
df = pd.DataFrame(data)
'''
   a  b  c
0  1  2  3
1  2  3  4
2  3  4  5
'''

補(bǔ):此時(shí)是生成索引是自增的,當(dāng)前的鍵值對(duì)是從列的角度;如果要指定索引的話,還是得在列的角度,那么對(duì)應(yīng)的值(鍵值對(duì))的列表(list)/中的元素/就要變成字典(dict)了。

df = pd.DataFrame({'a':{'A':1, 'B':2}, 'b':{'A':3, 'B':4}, 'c':{'A':5, 'B':6}})
'''
   a  b  c
A  1  3  5
B  2  4  6
'''

如上,當(dāng)值為list 時(shí),生成DataFrame,當(dāng)值為基本數(shù)據(jù)的時(shí)候,生成Series;鍵在DataFrame時(shí)為列屬性,在Series時(shí)為索引。

如果要增加一列的話,將'1' 改為'' 即可。

df['d'] = '1'
'''
   a  b  c  d
0  1  2  3  1
1  2  3  4  1
2  3  4  5  1
'''

此時(shí)加入的數(shù)據(jù)都是獨(dú)立的,即改變某行不會(huì)影響其他行。

df.loc[0, 'd'] = '*'
df.loc[0, 'e'] = '*'
'''
   a  b  c  d  e
0  1  2  3  *  *
1  2  3  4  1  1
2  3  4  5  1  1
'''

要想獲取其中的數(shù)據(jù),就用values屬性,其返回值是<class 'numpy.ndarray'> ,如果不熟悉需要用tolist() 方法轉(zhuǎn)為list。

df_nd = df.values
'''
[[1 2 3 '*' '*']
 [2 3 4 '1' 1]
 [3 4 5 '1' 1]]
'''
df_ls = df_nd.tolist()
'''
[[1, 2, 3, '*', '*'], [2, 3, 4, '1', 1], [3, 4, 5, '1', 1]]
'''

既然說(shuō)到了values 屬性,自然而然要延伸出1.獲取屬性,2.獲取索引 3.查看每一列的類型。在此我簡(jiǎn)單列出來(lái)函數(shù)及展示:

print(df.index)
'''
RangeIndex(start=0, stop=3, step=1)
'''
print(df.columns)
'''
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
'''
print(df.dtypes)
'''
a     int64
b     int64
c     int64
d    object
e    object
dtype: object
'''

注意我沒(méi)有特別指定索引,所以相當(dāng)于一個(gè)自增主鍵;d 列為str, e列因?yàn)樵?code>int中加入了str,所以都是object 類。誠(chéng)然,正常業(yè)務(wù)中,一個(gè)屬性應(yīng)該是一種類型的,所以用這個(gè)方法還是很有幫助的。

修改對(duì)象

對(duì)于各種數(shù)據(jù),常常涉及到:原來(lái)的索引是默認(rèn)自增序列,現(xiàn)在想讓某個(gè)屬性作為索引(此時(shí)有兩種,一是直接改原來(lái)的屬性;二是將索引改名。差別在于新的索引是否有屬性名);

增加屬性直接給新屬性賦空,上面有提到;

增加索引相當(dāng)于直接增加一行數(shù)據(jù)。

增加一列值:

df['f'] = [2,2,3]
'''
   a  b  c  d  e  f
A  1  2  3  *  *  2
B  2  3  4  1  1  2
C  3  4  5  1  1  3
'''

只要保證新加入這一列的行數(shù)與現(xiàn)有行數(shù)相同即可。

增加一行:

只需要再寫(xiě)一個(gè)DataFrame格式的數(shù)據(jù),然后.append()上去即可,注意,ignore_index = True 參數(shù)表示清除目前的索引,改為自增的,默認(rèn)為False;還有新的DF數(shù)據(jù)必須指定index,而且index 必須是集合格式。

new_df = pd.DataFrame({'a':4, 'b':5, 'c':6, 'd':7, 'e':8, 'f':9}, index = ["D"])
df = df.append(new_df, ignore_index = False)
'''
   a  b  c  d  e  f
A  1  2  3  *  *  2
B  2  3  4  1  1  2
C  3  4  5  1  1  3
D  4  5  6  7  8  9
'''

目前我的水平并不需要關(guān)心刪除,只要能跑通即可。

查數(shù)據(jù)主要有兩個(gè)方向,按行,按列。

按行主要是.loc[].iloc[]。前者主要是在有索引的時(shí)候用索引名進(jìn)行定位;后者則是基于位置的。

loc 為例(我常用):

df.loc[index_name, col_name] 可以看出,在二維數(shù)據(jù)中,行和列都指定了,就會(huì)確定出唯一的數(shù)據(jù);當(dāng)只指定行或列,就會(huì)出現(xiàn)對(duì)應(yīng)的行或列。注意index_namecol_name 可以是一個(gè)集合,即列表list,這樣可以選出更復(fù)雜的數(shù)據(jù)樣式。

print(df.loc['A', 'a']) # 1
print(df.loc['B', :])
'''
a    2
b    3
c    4
d    1
e    1
f    2
Name: B, dtype: object
'''
print(type(df.loc['B', :])) # <class 'pandas.core.series.Series'>
print(df.loc[:, 'd'])
'''
A    *
B    1
C    1
D    7
Name: d, dtype: object
'''
print(df.loc[['A','C'], ['d','f']])
'''
   d  f
A  *  2
C  1  3
'''

當(dāng)然,Series也可以變成list。簡(jiǎn)單的說(shuō),一維可以直接取值作為列表元素 Series.tolist(),二維的話就要取其中的數(shù)據(jù),DataFrame.values.tolist() 。如果在這個(gè)過(guò)程中想要自定義的index 那就只有df.columns.tolist(),在進(jìn)行手動(dòng)添加處理了。

按列的話主要是直接切片操作df[]。按列的話,只會(huì)有取整列的情況,所以情況要簡(jiǎn)單些。

即在切片中放一個(gè)值一個(gè)列表表示所篩選的列,在有些情況下,使用.col_name 能有很方便的操作。

print(df[['b','d']])
'''
   b  d
A  2  *
B  3  1
C  4  1
D  5  7
'''

將切片和.loc[]結(jié)合起來(lái),會(huì)有很多簡(jiǎn)單操作,但是建議不要太多依賴語(yǔ)法糖(假裝)了,不然在記憶的時(shí)候會(huì)變得混亂,如下面的代碼所示,在認(rèn)為[] 是對(duì)列進(jìn)行選取后,就盡量不要用它對(duì)行的操作(即傳入一個(gè)布爾列表,它會(huì)對(duì)行進(jìn)行選?。?。

print(df.loc[df.f>2])
'''
   a  b  c  d  e  f
C  3  4  5  1  1  3
D  4  5  6  7  8  9
'''
print(df.f>2)
'''
A    False
B    False
C     True
D     True
Name: f, dtype: bool
'''
print(df[[False, False, True, True]])
'''
   a  b  c  d  e  f
C  3  4  5  1  1  3
D  4  5  6  7  8  9
'''
print(df[[False, False, False, False, False, True]])
'''
ValueError: Item wrong length 6 instead of 4.
'''

改的話無(wú)非就是,改索引;改屬性;改數(shù)據(jù)。

對(duì)于改數(shù)據(jù)來(lái)說(shuō),就是賦值,我們能夠找到任意行,任意列,所以賦值只需要傳入對(duì)應(yīng)行列的list 即可。

df.loc[['A','B'], ['a', 'b']] = [[3, 4], [5, 6]]
'''
   a  b  c  d  e  f
A  3  4  3  *  *  2
B  5  6  4  1  1  2
C  3  4  5  1  1  3
D  4  5  6  7  8  9
'''

對(duì)于改屬性來(lái)說(shuō),也可以用上述方法暴力,即df.columns = ['1', '2', '3', '4', '5', '6'],此時(shí)要保證給的列表長(zhǎng)度要與原來(lái)屬性的長(zhǎng)度相同。

采用.rename()方法進(jìn)行更改的話更加靈活,注意一定要指定傳參的名字,inplace 如它的含義,是原地修改。

df.rename(columns = {"a":'g', 'c':'h'}, inplace = True)
'''
   g  b  h  d  e  f
A  3  4  3  *  *  2
B  5  6  4  1  1  2
C  3  4  5  1  1  3
D  4  5  6  7  8  9
'''

對(duì)于改索引來(lái)說(shuō),也是.rename() 方法,所以這就是一定要指明傳參名字的原因。

df.rename(index = {"A":'G', 'C':'H'}, inplace = True)
'''
   g  b  h  d  e  f
G  3  4  3  *  *  2
B  5  6  4  1  1  2
H  3  4  5  1  1  3
D  4  5  6  7  8  9
'''

寫(xiě)在最后

其實(shí)pandas使用時(shí),記住了以上常見(jiàn)的情況就能解決70%的問(wèn)題,還有10%的問(wèn)題是實(shí)際運(yùn)用中,DataFrame對(duì)象在函數(shù)中傳過(guò)來(lái)傳過(guò)去時(shí),對(duì)于原來(lái)的數(shù)據(jù)修改引發(fā)的問(wèn)題,這相關(guān)的可以考慮參看copy模塊和python參數(shù)傳遞機(jī)制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容