多場(chǎng)景下的Pandas使用技巧分享
記錄涉及使用pandas處理數(shù)據(jù)的一些方法和錯(cuò)誤
Pandas讀取數(shù)據(jù)相關(guān)
1.讀取csv文件
df_source = pd.read_csv('[file_path].csv', encoding='UTF-8')2.讀取.xlsx文件
df_source = pd.read_excel('[file_path].xlsx', encoding='utf-8') # 原始dataframePandas DataFrame操作
1.獲取dataframe某一列的數(shù)據(jù)
df_source = pd.read_excel('[file_path].xlsx', encoding='utf-8') # 原始dataframe
df_extract_left = df_source['[col_name]']
2.獲取某幾列的數(shù)據(jù)
df_source = pd.read_excel('[file_path].xlsx', encoding='utf-8')
col_n = ['col_name1', 'col_name2', 'col_name3', 'col_name4']
df_extract_right = pd.DataFrame(df_source ,columns=col_n)
3.Data Frame左連接操作
- 針對(duì)連個(gè)不同dataframe列名做左連接
df_merge = pd.merge(df_left, df_right, how='left', left_on='[左表的列名]', right_on='【右表的列名】')
左連接N->N的連接測(cè)試
- 左表
left_dict = {
'Fruits':['Apple','Banana','Cherry','Dates','Eggfruit'],
'Color': ['Red', 'Gray', 'Red', 'Brown', 'Yellow']
}
df_left = pd.DataFrame(left_dict)
df_left

- 右表
right_dict = {
'Fruits':['A','B','C','D','E'],
'Color': ['Red', 'Yellow', 'Red', 'Brown', 'Yellow']
}
df_right = pd.DataFrame(right_dict)
df_right

- 連接處理
df = pd.merge(df_left, df_right, how='left', left_on='Color', right_on='Color') df

4.處理 dataframe 某一列的值
- 具體要求: 刪除dataframe某一列中的換行符 \r\n
注意!?。。。。。?!
replace(‘\\n’,‘’) 無法得到正確的結(jié)果的
# 去除列多余的字符 \r\n
df['要處理列的列名'] = df.apply(lambda x:str(x['要處理列的列名']).replace('\r','').replace('\n','') ,axis=1)
df
5.根據(jù)dataframe某一列的值對(duì)其他列做聚合
要求 : 根據(jù)某一列的值 做group by后 ,屬于同一group的其他列的字符串做一個(gè)拼接
例如
- a “111”
- a “222”
- b “333”
- 結(jié)果
- a ”111,222“
- b “333”
df2 = df.groupby('group by的列')['做字符串拼接的列'].apply(lambda x:x.str.cat(sep=","))
df2
要求 : 對(duì)dataframe的兩列進(jìn)行聚合,并對(duì)第三列進(jìn)行求和
例如:
- a “111” 3
- a “222” 5
- a “111” 6
- b “112” 4
- b “222” 4
- b “222” 2
結(jié)果:
- a “111” 9
- a “222” 5
- b “112” 4
- b “222” 6
df.groupby(by=['聚合列1','聚合列2'])['第三列'].sum().reset_index(drop=False)
6. 刪除某幾列的數(shù)據(jù)
利用索引刪除多行,不能寫0:2
df.drop([0, 1])
利用列名刪除多列
df.drop(labels=[‘id',‘class'], axis=1)
7. 篩選出某列中符合條件的行
df[df['列名'] == '待篩選的值']
8. groupby后多行合并為一行
例如 group 1:
| col_a | col_b | col_c
| aaa | type1 | 1000
| aaa | type2 | 2000
結(jié)果:
| col_a | type1 | type2
| aaa | 1000 | 2000
def concat_df(x):
df_res = pd.pivot(x, index='col_a', columns='col_b', values="col_c")
df_res.insert(0,'col_a',x.iloc[0,0]) #調(diào)試時(shí)發(fā)現(xiàn)結(jié)果缺失col_a列,故添加該列值
return df_res
df_res = df.groupby('col_a').apply(lambda x : concat_df(x))
9. 刪除dataframe中某一列的符合條件的行
df_res=df.drop(df[df['列名']=='條件'].index)
10. groupby后遍歷 (1) for循環(huán)遍歷(推薦)
for name,df_group in df.groupby(by=['key']): # name為當(dāng)前group的key值 str類型 # df_group為當(dāng)前的子group dataframe類型
(2) apply 匿名函數(shù)遍歷 此方法在涉及到全局變量的賦值使用時(shí)不太方便
# x為每個(gè)group的dataframe name,df_group in df.groupby(by=['key']).apply(lamdba x : print(x))
舉例:
df2 = pd.DataFrame([['Tom', 16], ['Nancy', 18], ['Jack', 15],['Tom', 18],['Jack', 13],['Jack', 115]],columns=['cola','colb'])
cola colb
Tom 16
Nancy 18
Jack 15
Tom 18
Jack 13
Jack 115
# 方法一:
for name,df_group in df2.groupby(by=['cola']):
# 只演示第一個(gè)group的值
print(name) # Jack
print(df_group)
cola colb
Jack 15
Jack 13
Jack 115
# 方法二
df2.groupby(by=['cola']).apply(lambda x: print(x))
cola colb
2 Jack 15
4 Jack 13
5 Jack 115
cola colb
1 Nancy 18
cola colb
0 Tom 16
3 Tom 18
11. dataframe更改列名
df.rename(columns={'two':'twotwo'},inplace=True)12. dataframe隔行相減
需求:假設(shè)有以下dataframe,要計(jì)算每?jī)尚兄g的時(shí)間差
date
2019-08-29 09:20:37
2019-08-29 09:21:23
2019-08-29 09:22:09
…
df_res = pd.DataFrame()
df['DATE1'] = df['DATE'].shift(1)
df_time = (df['DATE'] - df['DATE1']).dt.total_seconds()
df_time.dropna(axis=0,inplace=True)
df_res = pd.concat([df_res,df_time])
12. dataframe刪除值為空的列或者行
df.dropna(axis=0,inplace=True) # axis = 0 為行 axis = 1為列 ,inplace = True表示替換原df
13. dataframe刪某列值中符合條件的行
需求 :現(xiàn)在有2個(gè)dataframe,要求刪除在df2中某列包含該值的行,該值為df1中的某列所出現(xiàn)的值
df1
a b c d
1 2 3 3
2 …
3 …
df2
a b c d
1 2 3 3
2 …
3 …
4…
5…
6…
結(jié)果
a b c d
4…
5…
6…
df2=df2[~df2['a'].isin(df1['a'].unique())]
14.統(tǒng)計(jì)dataframe每一列出現(xiàn)的不同值的最小值
count_min = min(df['列名'].value_counts()) # 返回一個(gè)series
15.統(tǒng)計(jì)兩列中數(shù)值相同的行數(shù)
df1
a b c d
1 2 3 3
2 2 3 4
3 3 4 5
統(tǒng)計(jì)a,b兩列值相同的行的個(gè)數(shù)
結(jié)果 2
len(set(df1['a']) & set(df1['b']))
16.刪除DataFrame兩列中值相同的行
df1
a b c d
1 2 3 3
2 2 3 4
3 3 4 5
刪除a,b列值相同的行 結(jié)果
a b c d
1 2 3 3
df1.loc[~(df1['a']==df1['b'])]
16.df判斷某列值為True,將另外一列對(duì)應(yīng)的值相加
df1
a b
T 2
F 2
T 3
b列中的某幾個(gè)值相加,這些值為a列中對(duì)應(yīng)值為T的
結(jié)果 5
df.loc[df['a']==True,'b'].sum()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python matplotlib如何給圖中的點(diǎn)加標(biāo)簽
Python使用DeepSeek進(jìn)行聯(lián)網(wǎng)搜索功能詳解
python3下pygame如何實(shí)現(xiàn)顯示中文
python 列表轉(zhuǎn)為字典的兩個(gè)小方法(小結(jié))
Python Web框架Flask中使用百度云存儲(chǔ)BCS實(shí)例
Python使用Remi庫(kù)打造Web GUI的完整指南

