生成對(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)簡單做測試的時(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]]
'''
既然說到了values
屬性叫挟,自然而然要延伸出1.獲取屬性,2.獲取索引 3.查看每一列的類型限煞。在此我簡單列出來函數(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
'''
注意我沒有特別指定索引抹恳,所以相當(dāng)于一個(gè)自增主鍵;d
列為str
署驻, e
列因?yàn)樵?code>int中加入了str
奋献,所以都是object
類。誠然旺上,正常業(yè)務(wù)中瓶蚂,一個(gè)屬性應(yīng)該是一種類型的,所以用這個(gè)方法還是很有幫助的宣吱。
修改對(duì)象
對(duì)于各種數(shù)據(jù)窃这,常常涉及到:原來的索引是默認(rèn)自增序列,現(xiàn)在想讓某個(gè)屬性作為索引(此時(shí)有兩種凌节,一是直接改原來的屬性钦听;二是將索引改名。差別在于新的索引是否有屬性名)倍奢;
增
增加屬性直接給新屬性賦空,上面有提到垒棋;
增加索引相當(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ù)相同即可。
增加一行:
只需要再寫一個(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
胁后。簡單的說,一維可以直接取值作為列表元素 Series.tolist()
嗦枢,二維的話就要取其中的數(shù)據(jù)攀芯,DataFrame.values.tolist()
。如果在這個(gè)過程中想要自定義的index
那就只有df.columns.tolist()
文虏,在進(jìn)行手動(dòng)添加處理了侣诺。
按列的話主要是直接切片操作df[]
。按列的話氧秘,只會(huì)有取整列的情況年鸳,所以情況要簡單些。
即在切片中放一個(gè)值或一個(gè)列表表示所篩選的列丸相,在有些情況下搔确,使用.col_name
能有很方便的操作。
print(df[['b','d']])
'''
b d
A 2 *
B 3 1
C 4 1
D 5 7
'''
將切片和.loc[]
結(jié)合起來,會(huì)有很多簡單操作膳算,但是建議不要太多依賴語法糖(假裝)了座硕,不然在記憶的時(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.
'''
改
改的話無非就是,改索引黍瞧;改屬性诸尽;改數(shù)據(jù)。
對(duì)于改數(shù)據(jù)來說印颤,就是賦值您机,我們能夠找到任意行,任意列年局,所以賦值只需要傳入對(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ì)于改屬性來說,也可以用上述方法暴力矢否,即df.columns = ['1', '2', '3', '4', '5', '6']
仲闽,此時(shí)要保證給的列表長度要與原來屬性的長度相同。
采用.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ì)于改索引來說顶吮,也是.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
'''
寫在最后
其實(shí)pandas使用時(shí)悴了,記住了以上常見的情況就能解決70%的問題,還有10%的問題是實(shí)際運(yùn)用中违寿,DataFrame對(duì)象在函數(shù)中傳過來傳過去時(shí)湃交,對(duì)于原來的數(shù)據(jù)修改引發(fā)的問題,這相關(guān)的可以考慮參看copy
模塊和python參數(shù)傳遞機(jī)制藤巢。