1. DataFrame 處理缺失值 dropna()
df2.dropna(axis=0, how='any', subset=[u'ToC'], inplace=True)
把在ToC列有缺失值的行去掉前端
補充:還能夠用df.fillna()來把缺失值替換爲某個特殊標記python
df = df.fillna("missing") # 用字符串替代 df = df.fillna(df.mean()) # 用均值或者其它描述性統計值替代
2. 根據某維度計算重複的行 duplicated()、value_counts()
print df.duplicated(['name']).value_counts() # 若是不指定列,默認會判斷全部列 """ 輸出: False 11118 True 664 表示有664行是重複的 """
duplicated()方法返回一個布爾型的Series,顯示各行是否爲重複行,非重複行顯示爲False,重複行顯示爲Truelinux
value_counts()方法統計數組或序列全部元素出現次數,對某一列統計能夠直接用df.column_name.value_counts()git
3. 去重 drop_duplicates()
df.drop_duplicates(['name'], keep='last', inplace=True) """ keep : {‘first’, ‘last’, False}, default ‘first’ first : Drop duplicates except for the first occurrence. last : Drop duplicates except for the last occurrence. False : Drop all duplicates. """
4. 拼接
(1) 拼接列 merge()
result = pd.merge(left, right, on='name', how='inner') """ 其它參數: pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False) Examples >>> A >>> B lkey value rkey value 0 foo 1 0 foo 5 1 bar 2 1 bar 6 2 baz 3 2 qux 7 3 foo 4 3 bar 8 >>> A.merge(B, left_on='lkey', right_on='rkey', how='outer') lkey value_x rkey value_y 0 foo 1 foo 5 1 foo 4 foo 5 2 bar 2 bar 6 3 bar 2 bar 8 4 baz 3 NaN NaN 5 NaN NaN qux 7 """
其它參考:Merge, join, and concatenate程序員
(2) 拼接行
def concat_by_row(data_dir, fout): dfs = [] for filename in os.listdir(data_dir): dfs.append(pd.read_excel(os.path.join(data_dir, filename))) print(dfs[-1].shape, filename) df = pd.concat(dfs, axis=0, ignore_index=True) # axis=0按行拼接;axis=1按列拼接 print(df.shape) df.to_excel(fout, index=False)
5. 找出在某一特定維度爲空值的全部行
bool_arr = df.name.notnull() print bool_arr.value_counts() for idx, value in bool_arr.iteritems(): if not value: print '\n', idx, value print df.iloc[idx]
6. 指定dataframe的維度及順序; 保存數據csv文件
res = {'name':[], 'buss':[], 'label':[]} with codecs.open(fname, encoding='utf8') as fr: for idx, line in enumerate(fr): item = json.loads(line) res['name'].append(item['name']) res['buss'].append(item['buss']) res['label'].append(item['label']) df = pd.DataFrame(res, columns=['name', 'buss', 'label']) df.to_csv('data/xxx.csv', index=False, encoding='utf-8')
7. 保存到文件
7.1 讀寫excel/csv格式文件
import pandas as pd def dataframe_read_and_write(fin, fout): # 讀取fin文件,添加一列"新應答" df = pd.read_excel(fin) # df = read_csv(fin, encoding='utf-8') print df.head() fields = [u"序號", u"問題描述", u"原始應答", u"新應答"] data_out = defaultdict(list) for idx, row in df.iterrows(): try: row = row.to_dict() new_answer = "xxxxxx" for field in fields[:-1]: data_out[field].append(row[field]) data_out[fields[-1]].append(new_answer) except Exception as error: print "Error line", idx, error df_out = pd.DataFrame(data_out, columns=fields) df_out.to_excel(fout, sheet_name="Sheet1", index=False, header=True) # df_out.to_csv(fout, index=False, encoding="utf-8") if __name__ == '__main__': dataframe_read_and_write(fin="data/tmp.xlsx", fout="data/tmp_out.xlsx")
7.2 將多張DataFrame表寫入到同一個excel文件的不一樣sheet中
import pandas as pd writer = pd.ExcelWriter('foo.xlsx') df.to_excel(writer, 'Data 0') df.to_excel(writer, 'Data 1') writer.save()
7.3 向一個已經存在的excel文件中寫入一張新sheet;若是文件不存在則建立一個新文件再寫入
import pandas from openpyxl import load_workbook def add_new_sheet(df, fout, sheet_name='Sheet1', columns=None): if fout and os.path.exists(fout): book = load_workbook(fout) writer = pd.ExcelWriter(fout, engine='openpyxl') writer.book = book writer.sheets = dict((ws.title, ws) for ws in book.worksheets) else: writer = pd.ExcelWriter(fout) df.to_excel(writer, sheet_name=sheet_name, columns=columns, index=False) writer.save() add_new_sheet(df, fout='Masterfile.xlsx', sheet_name="Main", columns=['Diff1', 'Diff2'])
參考:官方解決方案https://github.com/pandas-dev/pandas/issues/3441github
7.4 讀取excel文本中的多個sheet
import xlrd workbook = xlrd.open_workbook(fin) for sheet in workbook.sheets(): df = pd.read_excel(fin, sheet_name=sheet.name, index_col=None)
8. 排序
def sort_dataframe(df, fields_to_sort, fout=None): df = df.sort_values(by=fields_to_sort, ascending=True) if fout: df.to_excel(fout, index=False) return df df = pd.read_excel(data_file) sort_dataframe(df, fields_to_sort=["column_A", "column_B"], fout=data_file) df = pd.read_excel(data_file) # note: index改變,須要從文件從新讀取,纔會是有序的,後面遍歷df的時候纔不會出問題 print(df.head(10))
9. 軸標籤重命名 df.rename()(列重命名、行index重命名)
>>> df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) >>> df.rename(index=str, columns={"A": "a", "B": "c"}) a c 0 1 4 1 2 5 2 3 6 >>> df.rename(index=str, columns={"A": "a", "C": "c"}) a B 0 1 4 1 2 5 2 3 6 Using axis-style parameters >>> df.rename(str.lower, axis='columns') a b 0 1 4 1 2 5 2 3 6 >>> df.rename({1: 2, 2: 4}, axis='index') A B 0 1 4 2 2 5 4 3 6
參數說明:json
10. 數據選取,修改,切片
10.1 loc
在知道列名字的狀況下,df.loc[index,column] 選取指定行,列的數據數組
# df.loc[index, column_name],選取指定行和列的數據 df.loc[0,'name'] # 'Snow' df.loc[0:2, ['name','age']] #選取第0行到第2行,name列和age列的數據, 注意這裏的行選取是包含下標的。 df.loc[[2,3],['name','age']] #選取指定的第2行和第3行,name和age列的數據 df.loc[df['gender']=='M','name'] #選取gender列是M,name列的數據 df.loc[df['gender']=='M',['name','age']] #選取gender列是M,name和age列的數據
10.2 iloc
在column name特別長或者index是時間序列等各類不方便輸入的狀況下,能夠用iloc (i = index), iloc徹底用數字來定位 iloc[row_index, column_index]微信
df.iloc[0,0] #第0行第0列的數據,'Snow' df.iloc[1,2] #第1行第2列的數據,32 df.iloc[[1,3],0:2] #第1行和第3行,從第0列到第2列(不包含第2列)的數據 df.iloc[1:3,[1,2] #第1行到第3行(不包含第3行),第1列和第2列的數據
更多參考:
https://blog.csdn.net/yoonhee/article/details/76168253
11. 判斷某個cell是否爲空
if str(line["col_a"]).strip() == "nan": pass
12. Dataframe值替換
df["col_a"] = df["col_a"].replace({"b": "C", "e": "G"})
更多參考:https://jingyan.baidu.com/article/454316ab4d0e64f7a6c03a41.html
13. Dataframe篩選數據
df2 = df[df["col_a"] == "cc"] # 等於某個值 df3 = df[df["col_a"].isin(["bb", "cc", "ee"])] # 取值在某個範圍內
更多參考:https://jingyan.baidu.com/article/0eb457e508b6d303f0a90572.html
14. 其它經常使用操做
# df = pd.read_csv("../../data/data_part1.txt", sep="$") df = pd.read_csv("data/data_part1.csv", low_memory=False) # 數據概覽 df.info() df.describe() # ==> 只顯示float型維度的[count, mean, std, min]等統計信息, 例如0108, 3816, 2453, 0112, 2428, 2304 # 數據查看 df.head(n=5) # 查看開頭幾行, 默認n=5 df.tail(n=5) # 查看末尾幾行, 默認n=5 df.shape # 查看行列維度 df.columns # 查看列名和列數 df.dtypes # 查看數據類型 ==> 能夠看到哪些維度的數值是object型/float型 df["0108"].hist() # 查看變量分佈 df["0108"].unique() # 查看有哪些取值 df["0108"].value_counts() # 查看這一列的值統計 # 缺失值統計 df.isnull().sum() # 查看每一列缺失值狀況 df["n_null"] = df.isnull().sum(axis=1) # 查看每一行缺失值狀況 # 缺失值填充 mode_df = df.fillna(df.mode().iloc[0], inplace=True) # 用衆數填充 median_df = df.fillna(df.median()) # 用中位數填充 df["0108"][df.vid.isnull()] = "0" # 對某一列填充
15. 遇到的問題和解決方法
15.1 df.to_excel(fout) 報錯"openpyxl.utils.exceptions.IllegalCharacterError"
(step 1) pip install xlsxwriter
(step 2) df.to_excel(fout, engine="xlsxwriter")
15.2 保存文件時報錯"UserWarning: Ignoring URL 'http://www.xxxxxxx' with link or location/anchor > 255 characters since it exceeds Excel's limit for URLS"
writer = pd.ExcelWriter(fout, engine="xlsxwriter", options={'strings_to_urls': False}) df.to_excel(writer, index=False) writer.save()
參考:
暱稱:
退出 訂閱評論
[Ctrl+Enter快捷鍵提交]
【前端】SpreadJS表格控件,可嵌入系統開發的在線Excel
【推薦】碼雲企業版,高效的企業級軟件協做開發管理平臺
【推薦】程序員問答平臺,解決您開發中遇到的技術難題
· 2,Python經常使用庫之二:Pandas
· 數據處理之pandas庫
· pandas經常使用
· python之pandas數據篩選和csv操做
· 數據清理,預處理pandasdataframe操做技巧總結
· 剩1/279都能再生的魔幻動物:切斷再生一時爽,一直切一直爽
· 德國對臉書開出200萬罰單:因處理網絡仇恨言論不力
· 新陳代謝是如何開始的?
· 教育部:已約談有關搜索引擎網站 整治「志願填報指導」
· 萬字長文:不管什麼時候何地,亞馬遜都在「注視」着你
» 更多新聞...