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

下面的dataframe基本操作是在工作中积累的,都是常用又简单的操作,也有些是借鉴了CSDN等网站上大家的智慧。

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

df = pd.DataFrame(newlist)

2、对DataFrame进行合并操作

(1)左右合并

data = pd.merge(df1,df2,left_on = "name",right_on = " 姓名") # 默认只取两个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') # 取两个dataframe的全集,无论是否重复

(2)上下合并(前提:两个dataframe的字段数和字段名一样,才能保证能够匹配合并)

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

3、将 ‘公司名称’ 字段保留前10个字符(注意:前闭后开)

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

4、在字段‘姓名’中对含有 ‘’ 数据进行模糊匹配,相当于excel中的关键字查找

data = df[df["姓名"].str.contains(r'.*?张.*')]
data = df[df["姓名"].isin(["张"])]
data = df[~df["姓名"].isin(["张"])]  #通过~取反,筛选出姓名列中不包含"张"的数据

5、dataframe的文件读写问题(excel 可以改成 csv)

(1)读数据(例:‘证券代码’字段的数据有开头的数字 000 的,如何能成功取数后保留)

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

(2)存数据

# 不保留行号
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig', index = None)
# 保留行号
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig')
# 特殊:往 excel 中存数据时 ‘证券代码’字段的数据有开头的数字 000 丢失,
#      在字符串前面加上 '\t' 就能正常作为文本写入了
data_df['证券代码'] = '\t' + data_df['证券代码']
data_df.to_excel('data_df1.xlsx', encoding = 'utf-8-sig') # 保留行号 存数据

6、删除数据

(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)删除 重复的记录

data_new = data_df.drop_duplicates()

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

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

8、用 groupby 做分组运算

# 注:按 ‘行业’ 进行分类,将同一组的 ‘净利润’ 求和
data_groupby = data[['净利润']].groupby(data['行业']).sum()
# 多级分组, 求和
data_groupby = data.groupby(['年月日', '市场', '公司']).sum()

9、分组计算的结果, 把索引变成 列 名

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)把多行合并(把 同一地区的 当地政策 合并起来)

def applyData01(data):
    return ';'.join(data.values)
data_df = data_df.groupby(['地区'])['当地政策'].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、按 条件 筛选 数据

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

12、把 Series 取成一个元素值的时候

data_new = data.iloc[0]

13、dataframe转置

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

14、利用数据框data的name列中的非空值,去填充data的feature_1列中对应的NaN值

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

15、转变数据类型(int,str等)

data['证券代码'] = data['证券代码'].astype(str)

16、把 空值 填成 空字符串

data = data.fillna('')

17、按 某列 的值进行排序

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

18、data取 列名

data = data.columns.values.tolist()

19、替换某个字符

(1)只替换最后出现的那个
数据值中含有<>的使用 < > 替换<>

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

(2)替换所有出现的
数据值中含有<>的使用 < > 替换<>

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

20、正则方法 取一句话中的 XXXX年XX月XX日

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

21、取normal 数据

# 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位小数点

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

23、dataframe数据处理:标签列字符转数字

data_dict = data_df['name'].unique().tolist()
data_df['name_trans'] = data_df['name'].apply(lambda x:data_dict.index(x))
# 等用完后,再转回来
data_df['name_trans01'] = data_df['name_trans'].apply(lambda x:data_dict[x])

24、处理连续编码的问题,且固定长度为3位,不够的左边补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)转换整列的元素

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

(2)转换列名的

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打印结果被折叠,展开结果

pd.set_option('display.max_columns', None)   #显示完整的列
pd.set_option('display.max_rows', None)  #显示完整的行
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270