生成對(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_name 和col_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ī)制。