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)  #显示完整的行