一些Python常用小技巧總結(jié)

######導(dǎo)入 導(dǎo)出###############
df=pd.read_excel('D:/1.xls')
df.to_csv("D:/test.csv")
#沒有后綴的數(shù)據(jù)或奇怪的數(shù)據(jù)
pd.read_table('C:/Users/fafa/Desktop/testA/user_data')
pd.read_csv('testA/totalExposureLog.out',sep='\t',names=['ad_request_id','ad_request_time','ad_space_id','user_id','ad_id','Exposure_ad_size','bid','pctr','quality_ecpm','totalEcpm'],memory_map=True)
#### 導(dǎo)入Excel的sheet #############
# 方法一:通過 index 指定工作表
df3 = pd.read_excel(file_name, sheet_name=0)
# 方法二:指定工作表名稱
df4 = pd.read_excel(file_name, sheet_name='Sheet1')
#### 導(dǎo)出Excel的sheet #############
#① 導(dǎo)出帶有sheet的csv(只能有1個sheet)
df1.to_csv("3.csv",mode='a',index=False)
#② 導(dǎo)出帶有sheet的excel
##? 命名待被導(dǎo)入的文件
writer = pd.ExcelWriter("2.xlsx")
##? 命名待被導(dǎo)入的sheet ###
df1.to_excel(writer,sheet_name='公司維度表',index=False)
df2.to_excel(writer, sheet_name='貨物維度表',index=False)
writer.save()
writer.close()

#大文件分批讀取并導(dǎo)出為多個小文件嘱巾,方法2
#或者可以快速做一個DataFrame
df4 = pd.DataFrame({'col1':['1',3],'col2':[2,4]},index=['a','b'])

#大文件導(dǎo)入導(dǎo)入數(shù)據(jù)赴精,只選取前100行和特定幾列。
subset_columns = ['Job #', 'Doc #', 'Borough', 'Initial Cost', 'Total Est. Fee']
df = pd.read_csv('文件路徑', nrows=100, usecols=subset_columns)
df.head()

#################查看數(shù)據(jù)量#################
df.describe()
df.count()
#二签杈、查看數(shù)據(jù)常用方法
#查看列名
df.columns


##################? ? ? 列名修改 索引修改 內(nèi)容修改 數(shù)據(jù)類型轉(zhuǎn)換 時間轉(zhuǎn)換? ? ###############

##########給沒有表頭的數(shù)據(jù)補上列名 或者直接暴力更改列名##################
df.columns=['廣告id','創(chuàng)建時間','廣告賬戶id','商品id','商品類型','廣告行業(yè)id','素材尺寸']
##########更改列名更改列名更改列名################
dataA=df.rename(columns={"姓名":"最高分得主A","得分":"A題"})
########選擇需要的特征凹炸,更改列的順序##############
df1=df1[['廣告id','創(chuàng)建時間','商品id', '商品類型', '廣告行業(yè)id', '素材尺寸']]


######################### 關(guān)聯(lián)兩個表 merge ##########################
df3=pd.merge(df1,df2,on='廣告id')
#########################合并兩個表concat###########################
###把"賽題A"增到"A總"############
df1=pd.read_excel('D:/電專編程大賽每日數(shù)據(jù)/編程大賽A題.xls',header=0)
df2=pd.read_excel('D:/電專編程大賽每日數(shù)據(jù)/A總.xls',header=0)
#合并每日新數(shù)據(jù)df1到總表df2:
dfA=pd.concat([df1,df2]).drop_duplicates()
#去重(按照ID)
dfA=dfA.drop_duplicates("ID")
#重置索引
dfA=dfA.reset_index(drop=True)
#導(dǎo)出總表dfA:
dfA.to_excel("D:/電專編程大賽每日數(shù)據(jù)/A總.xls")

###########去重#####################
df=df.drop_duplicates(["班級","姓名"])#按照某兩列去重
df=df.drop_duplicates()#完全相等的去重

###############重置索引###############
df=df.reset_index(drop=True)

##################? ? ? 計時器? #######################################
import time
starttime = time.time()
#下面填寫具體程序
time.sleep(2.1)#延時2.1s
#上面填寫具體程序
endtime = time.time()
dtime = endtime - starttime
print("程序運行時間:%.8s s" % dtime)? #顯示到微秒

##############################? 時間戳? ? ###################################
#首先調(diào)用包洞渤,創(chuàng)建時間戳列
import pandas as pd
df=pd.DataFrame({"時間戳":[1529648412,1529648412]})

#時間戳按照周期加減一天
#比較好的參考

###############①方法? ? 時間戳(1529648412)列→(20180622) ##########################
import time
df['時間'] = df['時間戳'] .apply(lambda x:time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(x)))
df
###############②方法? ? 時間戳(1529648412)列→(20180622)
df['時間']=pd.to_datetime(df['時間戳'],unit='s') #→(2018-06-22 06:20:12)
##(2018-06-22 06:20:12) → (2018-06-22)
df=df.set_index('時間')? ? #把時間設(shè)置為索引(為了轉(zhuǎn)化)
df["當日日期"]=df.index.date? #轉(zhuǎn)化為當日日期(2018-06-22)
df=df.reset_index()

###############③方法? ? 時間戳(1529648412)列→(20180622)
################# Python 時間戳→當日/次日 日期? ########################

####時間戳(1529648412)→(2018-06-22 06:20:12)→(2018-06-22)
df['時間']=pd.to_datetime(df['時間戳'],unit='s')
df=df.set_index('時間')? ? #把時間設(shè)置為索引(為了轉(zhuǎn)化)
df["date"]=df.index.date? #轉(zhuǎn)化為日期(2018-06-22)
df=df.reset_index()
#####(2018-06-22)→年月日三列→(20180622)
df["年"]=df["date"].map(str).str[0:4]
df["月"]=df["date"].map(str).str[5:7]
df["日"]=df["date"].map(str).str[8:]
df["日期"]=df["年"].map(str)+df["月"]+df["日"]
df

#####時間戳(1529648412)列→年月日三列→為(20180622)? (暫時行不通 )
df['year'] =df['時間戳'].apply(lambda x: time.localtime(x).tm_year)
df['month'] = df['時間戳'].apply(lambda x: time.localtime(x).tm_mon)
df['day'] =df['時間戳'].apply(lambda x: time.localtime(x).tm_mday)
#暫時行不通(2018+6+22): df3["創(chuàng)建日期"]=df3["year"].map(str)+df3["month"].map(str)+df3["day"].map(str)

###################④方法:任意時間格式→時間戳函數(shù)
from datetime import datetime
#任意時間格式→時間戳函數(shù)
def time2stamp(cmnttime):
? ? cmnttime=datetime.strptime(cmnttime,'%Y%m%d') #這里可以更改任意格式:'%Y-%m-%d %H:%M:%S'? ?
? ? stamp=int(datetime.timestamp(cmnttime))
? ? return stamp
df['日期時間戳']=df['日期'].apply(time2stamp)

#########################? ? ? ? ? 處理臟數(shù)據(jù)? ? ##############################
############①找出一列中的不同元素雪隧,并按照最大值輸出#####
import pandas as pd
import numpy as np
df=pd.DataFrame({"id":["1","2","3,4"]})
df
#僅保留最大值
def max_str(t):
? ? a=[int(i) for i in t]
? ? return max(a)
df["id_max"]=df["id"].str.split(",").map(max_str)
df
############②找出一列中的不同元素,并按照最大值輸出#####
#清理帶有“,”的臟數(shù)據(jù)
df2=df.astype(str)#令所有內(nèi)容變成字符串
#清理廣告行業(yè)id的臟數(shù)據(jù)
df3=df2[df2["廣告行業(yè)id"].str.contains(",")]#包含逗號的數(shù)據(jù)
L1=list(df3.廣告行業(yè)id)#包含逗號的數(shù)據(jù)做成一個列表list1
L2=list(df2.廣告行業(yè)id)#全部數(shù)據(jù)做成一個列表list2
L3=list(set(L2)^set(L1))#列表求差集的方法:去掉臟數(shù)據(jù)的正常數(shù)據(jù)集合
df[df.廣告行業(yè)id.isin(L3)]#isin()搜尋正常數(shù)據(jù)集合的最終結(jié)果
#直接方法:? ~isin()搜尋不包含異常值的最終結(jié)果
df[~df.廣告行業(yè)id.isin(L1)]
############③找出一列中的不同元素悬蔽,拆分輸出#####
import pandas as pd
df=pd.DataFrame([["a","15"],["b,c","16"]],columns=["姓名","分數(shù)"])
df.set_index("分數(shù)")["姓名"].str.split(",",expand=True).stack().reset_index(level=1,drop=True).reset_index(name="姓名")
#############④處理空值NaN#######################
import pandas as pd,numpy as np?
df=pd.DataFrame({'姓名':'張三 李四 王五 趙六 孫七 馬八'.split(),'年齡':[18,np.nan,22,23,11,np.nan]})
#找出空值
isnull()
notnull()
#填充空值NaN為0 或者其他
df.fillna(0)
#刪去指定列空值所在行或列刪除空值行(axis=0)或列(axis=0)
df.dropna(axis=0, how="any", thresh=None, subset=None, inplace=False)
#當然可以直接簡寫
df.dropna()
#刪去指定列空值所在行
df[np.isnan(df.年齡)==False ]
#值替換
df.replace()

####################? ? 條件篩選+分組統(tǒng)計? ? #############################
#找出滿足條件的數(shù)據(jù)(年月相同扯躺,曝光日為創(chuàng)建的第二日)
df=df3[df3.創(chuàng)建日期.map(int)+1==df3.廣告請求日期.map(int)]

#統(tǒng)計"相同ID"和"創(chuàng)建時間"的數(shù)據(jù)計數(shù) (按照"廣告id" 和 "創(chuàng)建日期"分組并計數(shù)) 即"次日曝光量"
df['次日曝光量']=df.groupby(['廣告id','創(chuàng)建日期'])['廣告id'].transform(len)
#方法二
counts=df.groupby(['id','日期']).size() #獲得'id' '日期' "次日曝光量" 三列 這樣的表counts
counts=df.reset_index(name='label') #重置索引(否則表頭高度不一致)
df=df.merge(counts,how='inner',on=['id','日期'])#按照兩列關(guān)聯(lián)到一起,即得到“日曝光量”這一列

#按照max得分統(tǒng)計隊伍
data2=data.groupby(["隊伍名稱"],as_index=False)["得分"].max()
#按照sum得分統(tǒng)計隊伍
data2=data.groupby(["隊伍"],as_index=False)["得分"].sum()
#按照 個數(shù) 統(tǒng)計 隊伍
data.groupby(["隊伍"]).size()

#增加一列 求和
df["總分"]=df.sum(axis=1)
#排序(按照最終分數(shù))
df=df.sort_values(by="總分",ascending=False)
#讓索引從1開始
df.index = df.index+1

##############? 像excel一樣操作 按照某種條件 增加一列? ①############
def F(a):
? ? if a[1]<a[2]:
? ? ? ? s='甲'
? ? if a[1]>a[2]:
? ? ? ? s='乙'
? ? return s
df["完成人"]=[F(df.iloc[i]) for i in range(len(df.index))]

############? 像excel一樣操作 按照某種條件 增加一列? ② IF函數(shù)? ####
#對應(yīng)的Excel語言: =IF(條件蝎困,分支1录语,分支2)
df1['category'] = np.where(df1['total'] > 200000, 'A', 'B')

# 提取前2位 到新的一列#

df[b] = df[a].apply(lambda x : x[:2])


題目:[1,2,3,1,1,1,0,0,0,2,2,2,1,1,1,1,1]中 求出最長的連續(xù)序列個是1 個數(shù)是5

import pandas as pd
df=pd.DataFrame({"in":[1,2,3,1,1,1,0,0,0,2,2,2,1,1,1,1,1]})
df["out"]=df["in"].groupby((df["in"]!=df["in"].shift()).cumsum()).cumcount()+1
df[df["out"]>4]

1.? list1 = [1,2禾乘,3]

2.? list2 = [3澎埠,4,5]

3.? set1 = set(list1)? ? # 去重

4.? set2 = set(list2)? ? # 去重

5.? print(set(1)&set(2))? ? #交集

6.? print(set(1)^set(2))? #補集

7 set(1)-set(2)

groupby, agg, apply用法

def func(x):

? ? if x>20:

? ? ? ? return '20+k'

? ? else:

? ? ? ? return '0-20k'

position.apply(lambda x:func(x.avg),axis=1).head()

《pandas.apply實測使用方法》https://blog.csdn.net/weixin_39757737/article/details/78698316

If you are interested in this topic.
You can get in touch with me.
18234056952(Tel? wechat? qq)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末始藕,一起剝皮案震驚了整個濱河市蒲稳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伍派,老刑警劉巖江耀,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诉植,居然都是意外死亡祥国,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門倍踪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來系宫,“玉大人,你說我怎么就攤上這事建车±┙瑁” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵缤至,是天一觀的道長潮罪。 經(jīng)常有香客問我,道長领斥,這世上最難降的妖魔是什么嫉到? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮月洛,結(jié)果婚禮上何恶,老公的妹妹穿的比我還像新娘。我一直安慰自己嚼黔,他們只是感情好细层,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唬涧,像睡著了一般疫赎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碎节,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天捧搞,我揣著相機與錄音,去河邊找鬼狮荔。 笑死胎撇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轴合。 我是一名探鬼主播创坞,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼受葛!你這毒婦竟也來了题涨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤总滩,失蹤者是張志新(化名)和其女友劉穎纲堵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闰渔,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡席函,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冈涧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茂附。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡正蛙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出营曼,到底是詐尸還是另有隱情乒验,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布蒂阱,位于F島的核電站锻全,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏录煤。R本人自食惡果不足惜鳄厌,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妈踊。 院中可真熱鬧了嚎,春花似錦、人聲如沸廊营。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘风。三九已至夹囚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邀窃,已是汗流浹背荸哟。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞬捕,地道東北人鞍历。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像肪虎,于是被迫代替她去往敵國和親劣砍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容