寫在前面
這篇文章沒有任何理論,只是記錄一些可能用得上的技巧
參考:https://zhuanlan.zhihu.com/p/90925476
1导街、讀取數(shù)據(jù)
import pandas as pd
df = pd.read_csv("1.csv", header=0)
2术浪、保存數(shù)據(jù)
指定編碼格式楔脯,不然容易出現(xiàn)中文亂碼
index=None:去掉索引
df.to_csv("filename.csv", encoding="utf_8_sig", index=None)
3忙芒、刪除某一列/某一行【索引為0的行】
inplace: 默認(rèn)為False,不修改原數(shù)據(jù)损拢, 返回一個新數(shù)據(jù),如果設(shè)置為True撒犀,則是修改原數(shù)據(jù)
df.drop(['列名'],axis=1,inplace=True)
df.drop(index=0,inplace=True)
4福压、連接多個dataframe
事先存在df1、df2或舞、df3三個dataframe
指定axis=0表示列連接荆姆,axis=1,行連接
df = pd.concat([df1,df2,df3],axis=0)
5映凳、取出指定列的數(shù)據(jù)
subData = df[['col1','col2','col3']]
6胆筒、將字符串轉(zhuǎn)為浮點型或者整型
景:我拿到了一些銷售數(shù)據(jù),其中包含銷售金額诈豌,和門店價格仆救,但是數(shù)據(jù)是字符串形式的【標(biāo)準(zhǔn)的金額展示形式1,234.00 中間會有逗號分隔】
df['售價'] = df['售價'].str.replace(",","").astype(float)
7、分組->dataframe
參考:https://zhuanlan.zhihu.com/p/101284491
場景:統(tǒng)計公司下有多少分店及其銷售額矫渔,分店存在重復(fù)的【因為存在貨類字段彤蔽,導(dǎo)致不同貨類也會出現(xiàn)相同分店,所以出現(xiàn)分店重復(fù)】
- reset_index():重置索引
- 聚合之后未使用reset_index()
pgroup.agg({'售價':'sum'})
使用reset_index
pgroup.agg({'售價':'sum'}).reset_index()
這樣之后就可以再在這基礎(chǔ)上進(jìn)行分組分析庙洼,最終得到如下代碼
group = df.groupby(['分店所屬公司','分店名']) # 這里我是用兩列來做分組顿痪,根據(jù)自己的實際需求來實現(xiàn)
res = group.agg({'售價':'sum'}).reset_index().group("分店所屬公司").agg({'分店名':'count','售價':'sum'}).reset_index()
res.rename(columns={'分店所屬公司':'公司', '分店名':'門店數(shù)', '售價':'銷售額'}, inplace = True) # 替換列名
res
8镊辕、按條件提取
df = df[df['discount']<0.9]
可視化基礎(chǔ)參考:https://zhuanlan.zhihu.com/p/35816296
9、解決可視化中文亂碼問題
from pylab import mpl
#mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 指定默認(rèn)字體:解決plot不能顯示中文問題
mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號'-'顯示為方塊的問題
10员魏、修改列名
df.rename(columns={'old_col1':'new_col1', 'old_col2':'new_col2', 'old_col3':'new_col3'}, inplace = True)
11、根據(jù)時間按周分組
參考:https://blog.csdn.net/weixin_26711425/article/details/109069732
# 因為在這里時間是字符串叠聋,所以需要先轉(zhuǎn)換一下
dt["操作時間"] = pd.to_datetime(dt["操作時間"])
# 按周分組撕阎,下邊這種操作是從已有日期中從周一開始,默認(rèn)W是從周末開始【所以會導(dǎo)致碌补,如果日期開始時間不是周一或者周末的虏束,將導(dǎo)致無法選中】。
dtGroup = dt.groupby([pd.Grouper(key='操作時間', freq='W-MON')])
12厦章、數(shù)據(jù)處理镇匀,去除空格
df.replace('\s+','',regex=True,inplace=True)
13、讀取分組數(shù)據(jù)
fg = df.groupby(['col1','col2',...])
for i, (group, dataframe) in enumerate(fg):
print(group)
14袜啃、按指定條件替換數(shù)據(jù)
df.loc[df['分店']==0]="63998"
15汗侵、查看數(shù)據(jù)是否有nan等
# 查看每一列是否有NaN:
df.isnull().any(axis=0)
# 查看每一行是否有NaN:
df.isnull().any(axis=1)
# 查看所有數(shù)據(jù)中是否有NaN最快的:
df.isnull().values.any()
16、替換nan群发、inf
df.replace(np.nan, 0, inplace=True)
df.replace(np.inf, 0, inplace=True)
17晰韵、數(shù)據(jù)合并
參考:https://blog.csdn.net/qq_41853758/article/details/83280104
# df,right是分別兩個dataframe,on:是指通過這兩個dataframe中的哪個字段來連接熟妓,可以是多個字段
res = pd.merge(df, right, how='left', on="分店")
18雪猪、分組去重統(tǒng)計
group = df.groupby('col1')
group.agg({"col2":"count", "col3":pd.Series.nunique})
實例
# 加盟商數(shù)據(jù)文件 2020.csv
fc = pd.read_csv("franchise2020.csv",header=0)
fc1 = fc[['所屬公司','區(qū)域名稱','分店全稱']]
fc1 = fc1.drop_duplicates(keep='first')
fcG = fc1.groupby('所屬公司')
fcG.agg({"區(qū)域名稱": pd.Series.nunique, "分店全稱": pd.Series.nunique}).reset_index().to_csv("test.csv",encoding="utf-8-sig",index=None)
19、df.drop_duplicates去重
drop_duplicates(subset=['A','B'],keep='first',inplace=True)
代碼中subset對應(yīng)的值是列名起愈,表示只考慮這兩列只恨,將這兩列對應(yīng)值相同的行進(jìn)行去重。默認(rèn)值為subset=None表示考慮所有列抬虽。
- keep='first'表示保留第一次出現(xiàn)的重復(fù)行官觅,是默認(rèn)值。keep另外兩個取值為"last"和False阐污,分別表示保留最后一次出現(xiàn)的重復(fù)行和去除所有重復(fù)行缰猴。
- inplace=True表示直接在原來的DataFrame上刪除重復(fù)項,而默認(rèn)值False表示生成一個副本疤剑。
將副本賦值給dataframe:
data=data.drop_duplicates(subset=None,keep='first',inplace=False)
20滑绒、對數(shù)據(jù)進(jìn)行排序
df.sort_values("col",ascending=False)
21、日期只要年月日
df['just_date'] = df['dates'].dt.date
22隘膘、agg函數(shù)的基礎(chǔ)使用
group = df.groupby(['col1','col2'])
group.agg({"二級批發(fā)價":sum})