下面的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<\2', r'(.*)>(.*)':r'\1>\2'}
data = data.replace(trans, regex = True)
(2)替换所有出现的
数据值中含有<>的使用 < > 替换<>
data = data.replace('[<]', '<', regex = True)
data = data.replace('[>]', '>', 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、如下图
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) #显示完整的行