pandas 常用操作总结

目录

pandas批量删除优化

pandas读取遍历数据

pandas 统计元素出现次数

拼接合并表append

pandas修改列名,直接设置新表头即可

pandas列赋值,删除列

pandas修改列

pandas合并列

读取设置索引index

修改列数据类型

pandas不支持遍历修改,可以单元格修改:

pandas按行筛选

pandas批量插入数据

pandas模糊匹配筛选数据

pandas数据去重


pandas批量删除优化

批量删除方法1:

遍历drop删除,1万条,耗时24秒

self.df_label = pd.read_csv(self.label_file)

self.rename_columns = {'size': 'size_0/size_1'}
self.df_label.rename(columns=self.rename_columns, inplace=True)
def_count=0
start =time.time()
for index_a in self.df_label.index:
    try:
        image_path=self.initial_path + self.df_label.loc[index_a].values[0]
    except Exception as e:
        print(e)
    if not os.path.exists(image_path):
        related_path = image_path.replace(self.initial_path, "")
        # print('del',image_path)
        def_count+=1
        self.df_label.drop(self.df_label[self.df_label.img_path == related_path].index, inplace=True)
print("time1",time.time()-start)
start = time.time()

方案2:用concat重新建表,1万条左右,耗时24秒

self.df_label = pd.read_csv(self.label_file)

self.rename_columns = {'size': 'size_0/size_1'}
self.df_label.rename(columns=self.rename_columns, inplace=True)
def_count=0
start = time.time()
data2=[]
for index_a, data in self.df_label.iterrows():

    image_path=self.initial_path + data.values[0]
    if  os.path.exists(image_path):
        data2.append(pd.Series(data.values, index=self.df_label.columns))
        def_count += 1

gdp4=pd.concat(data2,axis=1)
print("time2",time.time()-start)

pandas读取遍历数据

    df_label= pd.read_csv(from_dir)
    ssh = get_ssh()
    imgs=[]
    out_to = to_dir + '/imgs/'
    os.makedirs(out_to, exist_ok=True)
    for row_index, data in df_label.iterrows():
        path=data['img_path']
        imgs.append('/xxx/' + os.path.basename(path))

pandas 统计元素出现次数

import pandas as pd

if __name__ == '__main__':
    data1 = {'auser': ['zszxz', 'craler', 'zszxz'], 'aprice': [100, 200, 300],
             'ahobby': ['reading', 'running', 'hiking']}

    data_len = len(data1['auser'])
    index = [i for i in range(data_len)]
    frame1 = pd.DataFrame(data1, index)

    # frame1['aprice'] = [1, 2, 3]  # 列赋值

    aaa= frame1['auser'].value_counts() #统计元素次数
    "/".join(aaa.index.tolist()) # 不同元素名单

    df1 = frame1.drop(['ahobby'], axis=1)  # 删除列

拼接合并表append

以下内容转自不错的博客:

pandas用法-全网最详细教程_一夜了的博客-CSDN博客_pandas

result = df1.append(df2)

这里写图片描述

上面会警告,推荐用cancat来拼接,不能自动去重:

import pandas as pd

x=['上海','北京','深圳','广州','重庆']
y=['上海','北京','深圳','广州','天津']
z=['天津','苏州','成都','武汉','杭州']

datas=[]
gdp1=pd.Series([32679,30320,24691,23000,20363],index=x)
gdp2=pd.Series([30133,28000,22286,21500,18595],index=y)
gdp3=pd.Series([18809,18597,15342,14847,13500],index=z)
datas.append(gdp1)
datas.append(gdp2)
datas.append(gdp3)
gdp4=pd.concat(datas, axis=1)


#gdp4 = pd.concat(data2, axis=1)
print('del count',self.df_label.shape[0]-def_count)
self.df_label = gdp4.T
self.df_label.to_csv(self.label_file, index=False)

1.3 join

result = left.join(right, on='key')

pandas修改列名,直接设置新表头即可

import pandas as pd


def getValue(s):
    if 'a' in s:
        return s.replace('bb','111')
    else:
        return s

if __name__ == '__main__':

    csv_file=r"D:\data\quality\aaa.csv"
    df=pd.read_csv(csv_file)

    new_columns=["aaaa",'bbb','ccc'] #会把数据也一起改,不能用

    df.columns =new_columns

    df.to_csv(csv_file, index=False)
    # print(df)

pandas列赋值,删除列

if __name__ == '__main__':
    data1 = {'auser': ['zszxz', 'craler', 'rose'], 'aprice': [100, 200, 300], 'ahobby': ['reading', 'running', 'hiking']}

    data_len=len(data1['auser'])
    index = [i for i in range(data_len)]
    frame1 = pd.DataFrame(data1, index)

    frame1['aprice'] =[1,2,3]   # 列赋值

    df1 = frame1.drop(['ahobby'], axis=1)  # 删除列

    df1.to_csv("temp.csv",index=False)

pandas修改列

    label_file=r'D:\data\cls\laduni\la_train\la_0_6_t\label.csv'

    shutil.copy(label_file,label_file.replace("label.csv","label_1112.csv"))
    df_label = pd.read_csv(label_file)

    values=[]
    for data in df_label.itertuples():
        if data[2]==2:
            values.append(6)
        elif data[2]==6:
            values.append(2)
        else:
            values.append(data[2])

    df_label[df_label.columns[1]] = values  # 列赋值

    df_label.to_csv(label_file, index=False)

pandas合并列

# -*- coding: utf-8 -*-
import pandas as pd

def col_rename():


    csv_file=r"D:\data\quality\aaa.csv"
    df=pd.read_csv(csv_file)

    new_columns=["aaaa",'bbb','ccc'] #会把数据也一起改,不能用
    # df02 = df.reindex(columns=new_columns)  # 调整索引,不仅仅调整行,也可以调整列
    # 注意这里reindex的妙用,可以自动关联数据,调整数据

    df.rename(columns={'box': 'small/big'}, inplace=True)

    df.to_csv(csv_file, index=False)


if __name__ == '__main__':
    data1 = {'auser': ['zszxz', 'craler', 'rose'], 'aprice': [100, 200, 300], 'ahobby': ['reading', 'running', 'hiking']}

    data_len=len(data1['auser'])
    index = [i for i in range(data_len)]
    frame1 = pd.DataFrame(data1, index)

    data2 = {'bperson': ['zszxz', 'craler', 'rose'], 'bnumber': [100, 200, 300],
             'bactivity': ['swing', 'riding', 'climbing']}

    frame2 = pd.DataFrame(data2, index)

    join = frame1.join(frame2)
    print(join)

读取设置索引index

比如读取数据时想把第一列设为index,那么只需要简单的

pd.read_csv("new_wordvecter.csv",index_col=[0])

修改列数据类型

使用astype如下: df[[column]] = df[[column]].astype(type)

pandas不支持遍历修改,可以单元格修改:

遍历修改报错:

    frame1 = pd.read_csv("temp.csv")


    for i in range(3):

        frame1.iloc[i]["aprice"]=i
    # for row in frame1.itertuples():

    frame1.to_csv("temp.csv",index=False)

pandas 报警告:A value is trying to be set on a copy of a slice from a DataFrame

我的解决方法:用list存储新的列数据,然后整列赋值。

解决方法二
换一种方式对 pandas 单元格进行修改

dfc = pd.DataFrame({'a':[1,2,3,4,5,6],'b':[2,3,4,5,6,7]})
dfc2 = dfc[['a','b']]
# 这个命令不会警告
dfc2.loc[3, 'b'] = 'english'

注意: loc 有一个很类似的api,即iloc ,但我在使用 dfc2.iloc[0][0] =111 修改单元格数据时弹出警
原文链接:https://blog.csdn.net/qq_38463737/article/details/124126393

pandas按行筛选

import pandas as pd

data1 = {'auser': ['zszxz', 'craler', 'rose'], 'aprice': [100, 200, 300], 'ahobby': ['reading', 'running', 'hiking']}

data_len =len(data1['auser'])
index = [i for i in range(data_len)]
frame1 = pd.DataFrame(data1, index)

data1=frame1.iloc[:2]

print(data1)

pandas批量插入数据

方法1:for循环 loc的方式批量生成数据很慢,10万数据200秒左右。

                            row_data.append(0)
                            row_data.append(
                                ";".join([str(xyxy[0]), str(xyxy[1]), str(xyxy[2] - xyxy[0]), str(xyxy[3] - xyxy[1])]))
                            row_data.append(1)
                            row_data.append(opt.cam_id)
                            df_label.loc[len(df_label) + 1] = row_data

方法2:

 把每列数据单独保存,最后按列赋值,效率非常快,10万数据4秒左右。

也可以参考第一条批量删除数据。

import os.path
import shutil
import time

import pandas as pd

if __name__ == '__main__':

    list_path=r'D:\data\quality\28w\train_3'
    g = os.walk(list_path)
    label_files = ['%s/%s' % (i[0], j) for i in g for j in i[-1] if j=='label.csv']

    for csv_file in label_files:
        csv_to_file=csv_file.replace("label.csv","label_cam.csv")

        data1=[]
        data2=[]
        data3=[]
        data4=[]
        data5=[]
        data6=[]

        df_label=pd.read_csv(csv_file)
        df_2 = pd.DataFrame(df_label.columns)
        start=time.time()
        # try:
        columns = {'none/incomplete': 'none/ban/small/big','is_train':'val/train','size':'size_0/size_1'}
        df_label.rename(columns=columns, inplace=True)
        col_names = df_label.columns.tolist()
        new_col = "cam_id"
        df_label.insert(loc=df_label.columns.size, column=new_col, value=-1) if new_col not in col_names else 1
        col_names = df_label.columns.tolist()
        start=time.time()
        col_1=[]
        for row_index,data in df_label.iterrows():

            img_path = data[col_names[0]]

            cam_id=int(img_path.split("_")[-3])

            col_1.append(cam_id)

            data1.append(data[col_names[0]])
            data2.append(data[col_names[1]])
            data3.append(data[col_names[2]])
            data4.append(data[col_names[3]])
            data5.append(data[col_names[4]])
            # data6.append(data[col_names[5]])


        df_label[col_names[0]] = data1
        df_label[col_names[1]] = data2
        df_label[col_names[2]] = data3
        df_label[col_names[3]] = data4
        df_label[col_names[4]] = data5
        df_label[col_names[5]] = col_1

        print('sace data len', df_label.shape[0],'time',time.time()-start)
        df_label.to_csv(csv_to_file, index=False)
        # except Exception as e:
        #     print(csv_file,e)

pandas模糊匹配筛选数据

模糊匹配可能效率较低,数据量大了会比较耗时。

我们在使用pandas读取Excel后一般都需要对数据进行筛选,如果是数字格式的话比较简单,如果遇到列全部都是文字的话,如果按照我们的需求进行筛选呢?如筛选有指定文字的数据集,筛选包含某几个字的数据集,甚至运用正则表达式,去使用更高级的筛选策略呢,欢迎阅读如何使用pandas对包含文字的列数据进行筛选。

样例数据:

固定值过滤(必须全匹配)
print(data[data['籍贯'] == '北京'])


模糊过滤  
       文字匹配
print(data[data['籍贯'].str.contains('河北')])


注意data['籍贯'].str.contains('河北')返回的数据类型是Series,内容为是否包含河北的bool值

正则匹配
Str.contians也支持传入正则表达式进行匹配,这就给数据筛选提供了多的可能

print(data[data['籍贯'].str.contains('.*?泰州')])
匹配以泰州结尾的籍贯


原文链接:https://blog.csdn.net/qq_42006613/article/details/109531495

pandas数据去重



下来介绍到就是用于数据去重的drop_duplicate方法
这个方法是对DataFrame格式的数据,去除特定列下面的重复行。返回DataFrame格式的数据。

这个方法里面有三个可填参数:
DataFrame.drop_duplicates(subset=None, keep=‘first’, inplace=False)

subset : column label or sequence of labels, optional 用来指定特定的列,默认所有列
keep : {‘first’, ‘last’, False}, default ‘first’ 删除重复项并保留第一次出现的项
inplace : boolean, default False 是直接在原来数据上修改还是保留一个副本

例如:
1、整行去重。
DataFrame.drop_duplicates()
2、按照其中某一列去重,示例代码

self.df_label=self.df_label.drop_duplicates(subset='img_path')


3、只要是重复的数据,我都删除(例如有三个数字:1,2,1;执行之后变成:2;重复的都删除了)
DataFrame.drop_duplicates(keep=False)

下面给上第3中情况的代码

import pandas as pd
csv=pd.read_csv('E:/aaa/03.csv',low_memory=False,error_bad_lines=False)#读取csv中的数据
df = pd.DataFrame(csv)
print(df.shape)#打印行数
f=df.drop_duplicates(keep=False)#去重
print(f.shape)#打印去重后的行数
f.to_csv('E:/aaa/distionct_03.csv',index=None)#写到一个新的文件
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法加油站

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值