前言
工作中处理数据时,经常需要使用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)
import jsonlines
def write_file(result):
#建立data.jsonl文件,以追加的方式写入数据
with jsonlines.open('result_5.json', mode = 'a') as json_writer:
json_writer.write(result)
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)