建立df:python
>>> df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=list('1234')) >>> df A B C D 1 0 1 2 3 2 4 5 6 7 3 8 9 10 11 4 12 13 14 15
1,刪除行app
1.1,dropspa
經過行名稱刪除:blog
df = df.drop(['1', '2']) # 不指定axis默認爲0 df.drop(['1', '3'], inplace=True)
經過行號刪除:ip
df.drop(df.index[0], inplace=True) # 刪除第1行 df.drop(df.index[0:3], inplace=True) # 刪除前3行 df.drop(df.index[[0, 2]], inplace=True) # 刪除第1第3行
1.2,經過各類篩選方法實現刪除行pandas
詳見pandas「選擇行單元格,選擇行列「的筆記it
舉例,經過篩選能夠實現不少功能,例如要對某行數據去重,能夠獲取去重後的index列表後,使用loc方法:class
>>> df.loc['2','B']=9 >>> df A B C D 1 0 1 2 3 2 4 9 6 7 3 8 9 10 11 4 12 13 14 15 >>> chooses = df['B'].drop_duplicates().index >>> df.loc[chooses] A B C D 1 0 1 2 3 2 4 9 6 7 4 12 13 14 15
2,刪除列效率
2.1,dellambda
del df['A'] # 刪除A列,會就地修改
2.2,drop
經過列名稱刪除:
df = df.drop(['B', 'C'], axis=1) # drop不會就地修改,建立副本返回 df.drop(['B', 'C'], axis=1, inplace=True) # inplace=True會就地修改
使用列數刪除,傳入參數是int,列表,者切片:
df.drop(df.columns[0], axis=1, inplace=True) # 刪除第1列 df.drop(df.columns[0:3], axis=1, inplace=True) # 刪除前3列 df.drop(df.columns[[0, 2]], axis=1, inplace=True) # 刪除第1第3列
2.3,經過各類篩選方法實現刪除列
詳見pandas「選擇行單元格,選擇行列「的筆記
3.1,loc,at,set_value
想增長一行,行名稱爲‘5’,內容爲[16, 17, 18, 19]
df.loc['5'] = [16, 17, 18, 19] # 後面的序列是Iterable就行 df.at['5'] = [16, 17, 18, 19] df.set_value('5', df.columns, [16, 17, 18, 19], takeable=False) # warning,set_value會被取消
3.2,append
添加有name的Series:
s = pd.Series([16, 17, 18, 19], index=df.columns, name='5') df = df.append(s)
添加沒有name的Series,必須ignore_index:
s = pd.Series([16, 17, 18, 19], index=df.columns) df = df.append(s, ignore_index=True)
能夠 append字典列表,一樣須要必須ignore_index:
ls = [{'A': 16, 'B': 17, 'C': 18, 'D': 19}, {'A': 20, 'B': 21, 'C': 22, 'D': 23}] df = df.append(ls, ignore_index=True)
3.3,逐行增長
簡單的逐行添加內容,能夠:
df.loc[len(df)] = [16, 17, 18, 19]
但須要注意:len(df)生成的是int,若是生成的int,df已經存在了,會覆蓋該行數據,而不會新增
3.4,插入行
增長行沒找到相似insert這種能夠插入的方法,暫時替代方法能夠先reindex,再賦值:
df = df.reindex(index=df.index.insert(2, '5')) df.loc['5'] = [16, 17, 18, 19]
通常涉及到增長列項時,常常會對現有的數據進行遍歷運算,得到新增列項的值,因此這裏結合對DataFrame的遍歷討論增長列。
例如,想增長一列'E',值等於'A'和'C'列對應值之和。
4.1,遍歷DataFrame獲取序列的方法
s = [a + c for a, c in zip(df['A'], df['C'])] # 經過遍歷獲取序列 s = [row['A'] + row['C'] for i, row in df.iterrows()] # 經過iterrows()獲取序列,s爲list s = df.apply(lambda row: row['A'] + row['C'], axis=1) # 經過apply獲取序列,s爲Series s = df['A'] + df['C'] # 經過Series矢量相加獲取序列 s = df['A'].values + df['C'].values # 經過Numpy矢量相加獲取序列
4.2,[ ],loc
經過df[]或者df.loc添加序列
df.loc[:, 'E'] = s df['E'] = s
4.3,Insert
能夠指定插入位置,和插入列名稱
df.insert(0, 'E', s)
4.4,concat
s = pd.Series([16, 17, 18, 19], name='E', index=df.index) df = pd.concat([df, s], axis=1)
4.5,iloc和loc遍歷過程當中給列賦值
效率比較低
df['E']是DataFrame的一個Series,是引用,對其修改也能改變DataFrame,但運行時報了Warning
df['E'] = None # 需事先建立e列,不然iloc遍歷會報錯,loc遍歷無需事先建立 for i in range(len(df)): df['E'].iloc[i] = df['A'].iloc[i] + df['C'].iloc[i] # SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
不用Series不會報Warning:
df['E'] = None col_no = [i for i in df.columns].index('E') for i in range(len(df)): df.iloc[i, col_no] = df['A'].iloc[i] + df['C'].iloc[i]
用loc無需先給E列賦空值:
for i in df.index: df.loc[i, 'E'] = df.loc[i, 'A'] + df.loc[i, 'C']
4.6,逐列增長
簡單的逐列添加內容,能夠:
df[len(df)] = [16, 17, 18, 19]
但須要注意:len(df)生成的是int,若是生成的int,df已經存在了,會覆蓋該列數據,而不會新增
4.7,其餘方法
增長3列,EFG,value默認爲np.NaN
df = pd.concat([df, pd.DataFrame(columns=list('EFG'))]) # 列的次序沒法指定,而且fillna時會對整個df作出調整 df = df.reindex(columns=list('ABCDEFG'), fill_value=0) # 列的次序按照list指定,而且fill_value只對新增列作出調整,推薦!