【工程实践】使用pandas的记录

前言

        工作中处理数据时,经常需要使用pandas,记录一些工作中使用pandas的习惯。

1. 合并数据

#读取原始数据
data1 = pd.read_excel('/home/zhenhengdong/WORk/Classfier/Dates/Original/1.xlsx')
data2 = pd.read_excel('/home/zhenhengdong/WORk/Classfier/Dates/Original/2.xlsx')
data3 = pd.read_excel('/home/zhenhengdong/WORk/Classfier/Dates/Original/3.xlsx')
data4 = pd.read_excel('/home/zhenhengdong/WORk/Classfier/Dates/Original/20230712.xlsx')
#新建data
data  = pd.DataFrame()
#有选择的将原始数据进行合并
data['序号'] = pd.concat([data4['序号'],data3['序号'],data1['序号'],data2['序号']], ignore_index=False)
data['内容'] = pd.concat([data4['内容'],data3['内容'],data1['内容'],data2['内容']], ignore_index=False)
data['一级分类'] = pd.concat([data4['一级分类'],data3['一级分类'],data1['一级分类'],data2['一级分类']], ignore_index=False)
data['二级分类'] = pd.concat([data4['二级分类'],data3['二级分类'],data1['二级分类'],data2['二级分类']], ignore_index=False)
data['反馈类型'] = pd.concat([data4['反馈类型'],data3['反馈类型'],data1['反馈类型'],data2['反馈类型']], ignore_index=False)

2.删除数据

2.1 删除行

        index 参数指定了要删除的行,inplace 参数表示是否在原数据集上进行操作。

#根据行索引删除行
data.drop(index=[0, 4], inplace=True)

2.2 删除列

        columns 参数指定了要删除的列,inplace 参数表示是否在原数据集上进行操作。

#根据列名称删除列
data.drop(columns=['class'], inplace=True)

         也可以使用del做删除。

 del data['class']

2.3 删除重复行

        subset 参数指定需要检查重复的列,默认值为所有列。inplace 参数表示是否在原数据集上进行操作。keep=last表示保留最后一个重复行,keep=first表示保留第一个重复行。

data.drop_duplicates(subset="gender", inplace=True,keep='last')

2.4 删除缺失行

        axis:轴。0或'index',表示按行删除;1或'columns',表示按列删除。

        how:筛选方式。‘any’,表示该行/列只要有一个以上的空值,就删除该行/列;‘all’,表示该行/列全部都为空值,就删除该行/列。

        thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/列。

        subset:子集。列表,元素为行或者列的索引。如果axis=0或者‘index’,subset中元素为列的索引;如果axis=1或者‘column’,subset中元素为行的索引。由subset限制的子区域,是判断是否删除该行/列的条件判断区域。

        inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。

dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# 删除包含缺失值的行
data.dropna()
# 删除全部为缺失值的行
data.dropna(how='all')
# 删除至少有2个缺失值的行
data.dropna(thresh=2)
# 根据指定的列删除包含缺失的行
data.dropna(subset=['列名'])

2.5 按条件删除行

2.5.1 符合条件的随机删除

        删除反馈类型为BUG问题的行,随机删除掉44个。

from random import sample
drop_index_1 =  data[(data.反馈类型 == 'BUG问题')].index.tolist()
drop_index_2 = sample(drop_index_1, k = 44)
data =  data.drop(index = drop_index_2)
#重新设置索引
data.reset_index(drop=True, inplace=True)

2.5.2 符合条件的全部删除

data =  data.drop(index = data[(data.反馈类型 == '其他')].index.tolist())

3.重新设置索引

data.reset_index(drop=True, inplace=True)

4.查看类别个数

for index,key_values in enumerate(data.联合分类.value_counts().items()):
    print(index,key_values)

data['标注类型'].value_counts()

 5.遍历data

        通过data.iloc[index]取出指定行的数据。

content_list = []
label_list = []
for index in range(len(data)):
    content = data.iloc[index]['内容']
    label = data.iloc[index]['标注类型']
    content_list.append(content)
    label_list.append(label)

6.新建data

new_data = pd.DataFrame()
new_data['content'] = content_list
new_data['label'] = label_list

7.统计并设置标签

Feedback_type = {}
for index,item in enumerate(list(new_data['label'].value_counts().keys())):
    Feedback_type[item]  = index
def add_Feedback_type_index(Feed_type):
    index = Feedback_type.get(Feed_type)
    return index
new_data['feedback_type_label'] = new_data['label'].apply(add_Feedback_type_index)

8.保存映射文件 

with open("Feedback_type.json", "w") as outfile:
    json.dump(Feedback_type, outfile,ensure_ascii=False)

9.统计数据生成excel

def Statistics(data):
    keys = []
    values = []
    for key_values in (data):
        keys.append(key_values[0])
        values.append(key_values[1])
    pkg_name_index_xlsx=pd.DataFrame()
    pkg_name_index_xlsx['类目'] = keys
    pkg_name_index_xlsx['数量'] = values
    pkg_name_index_xlsx.to_excel(excel_writer= r"联合分类.xlsx")
Statistics(data.联合分类.value_counts().items())

10.存储data

#将合并的data存储
data.to_csv('./Total_data.csv',index = False,encoding='utf8')

11.数据负采样

#统计联合分类中数量大于4000的类目
drop_element_list = []
for index,key_values in enumerate(data.联合分类.value_counts().items()):
    if key_values[1] > 4000:
        drop_element_list.append(key_values[0])

#对其删除1200条
from random import sample
def drop_element(data,drop_element_list):
    for index in range(len(drop_element_list)):
        element = drop_element_list[index]
        result = 1200
        drop_index_1 =  data[(data.联合分类 == element)].index.tolist()
        drop_index_2 = sample(drop_index_1, k=result)
        data =  data.drop(index = drop_index_2)
        data.reset_index(drop=True, inplace=True)
    return data
data = drop_element(data,drop_element_list)

猜你喜欢

转载自blog.csdn.net/weixin_44750512/article/details/132335340