dataframe基本操作整理(工作中常用的基本的)

下面的dataframe基本操作是在工作中積累的,都是常用又簡單的操作,也有些是借鑒了CSDN等網(wǎng)站上大家的智慧。

1、將[{'a':'int','b':'str'},{'a':'cat','b':'dog'}]變成dataframe

df = pd.DataFrame(newlist)

2、對DataFrame進(jìn)行合并操作

(1)左右合并

data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名") # 默認(rèn)只取兩個(gè)dataframe的交集, 同  how = 'inner'
data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名", how = 'left') # 以左邊dataframe的值為主
data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名", how = 'right') # 以右邊dataframe的值為主
data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名", how = 'inner')
data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名", how = 'outer') # 取兩個(gè)dataframe的全集,無論是否重復(fù)

(2)上下合并(前提:兩個(gè)dataframe的字段數(shù)和字段名一樣,才能保證能夠匹配合并)

data = pd.concat([df1, df2, df3, df4], axis = 0)

3、將 ‘公司名稱’ 字段保留前10個(gè)字符(注意:前閉后開)

data['公司名稱'] =  data['公司名稱'].str[0:10]

4、在字段‘姓名’中對含有 ‘’ 數(shù)據(jù)進(jìn)行模糊匹配,相當(dāng)于excel中的關(guān)鍵字查找

data = df[df["姓名"].str.contains(r'.*?張.*')]
data = df[df["姓名"].isin(["張"])]
data = df[~df["姓名"].isin(["張"])]  #通過~取反,篩選出姓名列中不包含"張"的數(shù)據(jù)

5、dataframe的文件讀寫問題(excel 可以改成 csv)

(1)讀數(shù)據(jù)(例:‘證券代碼’字段的數(shù)據(jù)有開頭的數(shù)字 000 的,如何能成功取數(shù)后保留)

excelPath = 'excel_element.xlsx'
excel_df = pd.read_excel(excelPath, encoding = 'utf-8-sig', converters = {u'證券代碼':str})

(2)存數(shù)據(jù)

# 不保留行號(hào)
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig', index = None)
# 保留行號(hào)
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig')
# 特殊:往 excel 中存數(shù)據(jù)時(shí) ‘證券代碼’字段的數(shù)據(jù)有開頭的數(shù)字 000 丟失,
#      在字符串前面加上 '\t' 就能正常作為文本寫入了
data_df['證券代碼'] = '\t' + data_df['證券代碼']
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig') # 保留行號(hào) 存數(shù)據(jù)

6、刪除數(shù)據(jù)

(1)刪除 ‘姓名’ 列中含有空值的那一行記錄

data_new = data[data['姓名'].notna()] 

(2)刪除 None 所在的 行

data_new = data_new.dropna()

(3)刪除 整行都是空的 記錄(行)

data_new = data_new.dropna(axis = 0, how = 'all')

(4)刪除 某幾列

data_new.drop(data_new[['a1', 'a2', 'a3', 'a4']], axis = 1, inplace = True)

(5)刪除 重復(fù)的記錄

data_new = data_df.drop_duplicates()

7、更改列明(是否保存:inplace = True 是;inplace = True 否)

data_new.rename(columns = {'name': '姓名', 'company': '公司名稱'}, inplace = True)

8、用 groupby 做分組運(yùn)算

# 注:按 ‘行業(yè)’ 進(jìn)行分類,將同一組的 ‘凈利潤’ 求和
data_groupby = data[['凈利潤']].groupby(data['行業(yè)']).sum()
# 多級(jí)分組, 求和
data_groupby = data.groupby(['年月日', '市場', '公司']).sum()

9、分組計(jì)算的結(jié)果, 把索引變成 列 名

data_groupby = data_groupby.reset_index()

10、把 多列 合并 和 分開

(1)把多列合并

data['綜合信息'] = data[['姓名', '地址']].apply(lambda x: '/'.join(x), axis = 1)

(2)把合并列的再分開

data['姓名'] = data['綜合信息'].map(lambda x: x.split('/')[0])
data['地址'] = data['綜合信息'].map(lambda x: x.split('/')[1])

(3)把多行合并(把 同一地區(qū)的 當(dāng)?shù)卣?合并起來)

def applyData01(data):
    return ';'.join(data.values)
data_df = data_df.groupby(['地區(qū)'])['當(dāng)?shù)卣?].apply(applyData01)
data_df = data_df.reset_index()

(4)把合并的行分開

data = data.drop('m1',axis =1).join(df['m1'].str.split('/', expand = True).stack().reset_index(level = 1,drop = True).rename('m_new'))

11、按 條件 篩選 數(shù)據(jù)

data_new = data[(data['gender'] == '女')&(data['地區(qū)'] != 'a2')]['姓名']

12、把 Series 取成一個(gè)元素值的時(shí)候

data_new = data.iloc[0]

13、dataframe轉(zhuǎn)置

data_new = pd.DataFrame(data.values.T, index = data.columns, columns = data.index)

14、利用數(shù)據(jù)框data的name列中的非空值,去填充data的feature_1列中對應(yīng)的NaN值

data.loc[data['feature_1'].isnull(), 'feature_1'] = data[data['feature_1'].isnull()]['name']

15、轉(zhuǎn)變數(shù)據(jù)類型(int,str等)

data['證券代碼'] = data['證券代碼'].astype(str)

16、把 空值 填成 空字符串

data = data.fillna('')

17、按 某列 的值進(jìn)行排序

data = data.sort_values(by = '年月日', ascending = True)

18、data取 列名

data = data.columns.values.tolist()

19、替換某個(gè)字符

(1)只替換最后出現(xiàn)的那個(gè)
數(shù)據(jù)值中含有<>的使用 < > 替換<>

trans = {r'(.*)<(.*)':r'\1&lt;\2', r'(.*)>(.*)':r'\1&gt;\2'}
data = data.replace(trans, regex = True)

(2)替換所有出現(xiàn)的
數(shù)據(jù)值中含有<>的使用 < > 替換<>

data = data.replace('[<]', '&lt;', regex = True)
data = data.replace('[>]', '&gt;', regex = True)

20、正則方法 取一句話中的 XXXX年XX月XX日

dataAll['需要披露的時(shí)間']=dataAll['notice'].str.findall(r"(\d{4}年\d{1,2}月\d{1,2}日)")

21、取normal 數(shù)據(jù)

# from pz_base import pz_webapi
def getData():
    data = []
    postDate = {
        'code':'data001001',
        'op':'r'
}
resp = pz_webapi.data(id = 'normal',data = postDate)
if resp['re'] == 0:
    data = resp['data']['data']
else:
    print(f"getData,error,resp={resp}")
return data

22、保留2位小數(shù)點(diǎn)

data_df['金額'] = data_df['金額'].apply(lambda x:'%.2f' %x)

23、dataframe數(shù)據(jù)處理:標(biāo)簽列字符轉(zhuǎn)數(shù)字

data_dict = data_df['name'].unique().tolist()
data_df['name_trans'] = data_df['name'].apply(lambda x:data_dict.index(x))
# 等用完后,再轉(zhuǎn)回來
data_df['name_trans01'] = data_df['name_trans'].apply(lambda x:data_dict[x])

24、處理連續(xù)編碼的問題,且固定長度為3位,不夠的左邊補(bǔ)0

data_dict = data['code01'].unique().tolist()
# 由于編碼從001開始,所以要加1
data['code001'] = data['code01'].apply(lambda x:data_dict.index(x)+1) 
def dfApply(d):
    number = str(d).zfill(3)
    return number
data['code001'] = data['code001'].apply(dfApply)

25、大小寫處理

(1)轉(zhuǎn)換整列的元素

data['name'] = data['name'].str.lower()

(2)轉(zhuǎn)換列名的

data.columns = [col.lower() for col in list(data.columns.values)]

26、如下圖

image.png
data_dict = data.groupby('column1').column2.apply(list).to_dict()

27、pycharm打印結(jié)果被折疊,展開結(jié)果

pd.set_option('display.max_columns', None)   #顯示完整的列
pd.set_option('display.max_rows', None)  #顯示完整的行
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容