每天要以两倍的速度学习

不想平凡所以必须Pow(努力,n)(n>1)

导航

【WXSC】pandas

归纳整理了一些工作中常用到的pandas使用技巧,以便方便后续工作。

数据

1.数据去重

df.drop_duplicates(subset=['A','B'],keep='first',inplace=True)

  • subset: 输入要进行去重的列名,默认为None
  • keep: 可选参数有三个:‘first’、 ‘last’、 False, 默认值 ‘first’。其中,
    • first: 保留第一次出现的重复行,删除后面的重复行。
    • last: 删除重复项,保留最后一次出现。
    • False: 删除所有重复项。
  • inplace:布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。

2.DataFrame转换

df.to_dict(orient=‘dict’)

  • orient: 可选参数有‘dict’,‘list’, ‘series’,‘records’, ‘index’
    • dict:{column → {index → value}}
    • list: {column → [values]}
    • series: {column → Series(values)}
    • split: {index → [index], column → [column], data → [values]}
    • records: [{column → value}, ... , {column → value}]
    • index: {index → {column → value}}

3.数据排序

df.sort_values(*by*=‘##’,*axis*=0,*ascending*=True, *inplace*=False, *na_position*=‘last’)

  • by: 指定列名(axis=0或’index’)或索引值(axis=1或’columns’)
  • axis: 若axis=0或’index’,则按照指定列中数据大小排序;若axis=1或’columns’,则按照指定索引中数据大小排序,默认axis=0
  • ascending: 是否按指定列的数组升序排列,默认为True,即升序排列
  • inplace: 是否用排序后的数据集替换原来的数据,默认为False,即不替换
  • na_position: {‘first’,‘last’},设定缺失值的显示位置

4.合并两个DataFrame

  1. pd.concat(objs, axis = 0, ignore_index = False, join = "outer)
    concat是”contatenate"的缩写,指的是多表之间的“拼接”。其实“拼接”和“合并”还是有区别的,后面我们会说到。事实上,concat方法有很多参数,上例给出的只是常用的。其中:

    • objs: 指的是要合并的dataframe(们)。可以是一个列表[df1,df2,...]也可以是一个集合(df1,df2,...)。(我是这么理解的,试了一下列表集合都有效)
    • axis:指的是拼接的方向。axis = 0指的是拼接行(向下拼接),axis = 1指的是拼接列(向右拼接)。
    • ignore_index: 指的是拼接后是否忽视原df各自的索引。比如,假如我们按行拼接,原来df1中有五条数据,索引是0,1,2,3,4。原来的df2中也有五条数据,索引也是0,1,2,3,4。如果我们在合并时,将ignoreindex的值设为False,那么拼接后df的索引就是0,1,2,3,4,0,1,2,3,4。那么如果将ignore_index的值设为True, 那么拼接后df的索引就是0,1,2,3,4,5,6,7...
    • join:表示“如何拼接”。由于两表中的信息可能是不同的,所以要设置这个参数以表明拼接方式。其中,outer表示取并集,inner表示取交集。
  2. df1.append(df2)
    append可以视作axis=0的,简便版的concat。也就是说,它只支持行拼接,同时比concat简便一些。
    这里要注意和concat的用法区别。concat是pd的属性,所以调用的时候应该是pd.concat((df1,df2)),而append是对df的方法,所以调用的时候是df1.append(df2)

  3. pd.merge(left, right, how = "inner",on = "None")
    与concat(拼接)不同,merge才是真正意义上的”合并“。拼接和合并的区别在于,拼接只是简单地”堆“在一起,而合并则是基于某一个”主键“将两个表”合“在一起。事实上merge也有很多参数,这里只列了最常用的。其中:

    • left: 左表。也就是第一个df。
    • right:右表。也就是第二个df。
    • how: 和concat里面的"join"类似,表示“如何合并两表。除了”inner“和”outer“以外,merge中还有”left"(基于左表进行合并)和“right”(基于右表进行合并)。具体地:1)left: 只使用左表的键。2)right:只使用右表的键。3)inner: 使用左右表键的交集。4)outer:使用左右表键的并集。
    • on: 表示按照哪一个键来进行合并。
  4. left.join(right,on = "key", how = "left")
    类似于append之于concat,join也可以被理解为merge的一个简便并且特殊的方法。join也可以设置参数"how",只不过这里默认值不同。Merge中,how的默认值是”inner“,join中的默认值为”left"。

5.字符串转换为数值

df.apply(pd.to_numeric, errors='coerce').fillna(0)
to_numeric() 函数将字符转化为数值,并让 pandas 把任意无效输入转为 NaN

6.优化 DataFrame 对内存的占用

  • 只读取切实所需的列,使用usecols参数
cols = ['beer_servings','continent']
small_drinks = pd.read_csv('data/drinks.csv', usecols=cols)
  • 把包含类别型数据的 object 列转换为 Category 数据类型,通过指定 dtype 参数实现
dtypes ={'continent':'category'}
smaller_drinks = pd.read_csv('data/drinks.csv',usecols=cols, dtype=dtypes)

7.删除包含特定字符串所在的行

去除包含字符exp的行

df = pd.DataFrame({'a':[1,2,3,4], 'b':['s1', 'exp_s2', 's3','exps4'], 'c':[5,6,7,8], 'd':[3,2,5,10]})
idf = df[~df['b'].str.contains('exp')]

8.删除一行或者一列

df.drop(labels=None,axis=0, index=None, columns=None, inplace=False)

  • labels: 就是要删除的行列的名字,用列表给定
  • axis: 默认为0,指删除行,因此删除columns时要指定axis=1;
  • index: 直接指定要删除的行
  • columns: 直接指定要删除的列
  • inplace:
    • False: 该删除操作不改变原数据,而是返回一个执行删除操作后的新dataframe;
    • True: 则会直接在原数据上进行删除操作,删除后无法返回。

9.将多个表写入一个excel文件中

pd.ExcelWriter(path, engine=None, date_format=None, datetime_format=None, mode='w', storage_options=None, if_sheet_exists=None, engine_kwargs=None, **kwargs)

  • path:str,xls或xlsx文件的路径。
  • engine:str (可选参数),用于编写的引擎。如果为无,则默认为io.excel..writer。注意:只能作为关键字参数传递。
  • date_format:str, 默认为 None,格式字符串,用于写入Excel文件的日期(例如“ YYYY-MM-DD”)。
  • datetime_format:str, 默认为 None,写入Excel文件的日期时间对象的格式字符串。 (例如“ YYYY-MM-DD HH:MM:SS”)。
  • mode:{‘w’, ‘a’}, 默认为 ‘w’,要使用的文件模式(写或追加)。
  • if_sheet_exists:{‘error’, ‘new’, ‘replace’, ‘overlay’}, default ‘error’
    • error: 直接抛出错误
    • new: 创建一个新表
    • replace: 在开始写入前,删除旧表
    • overlay: 追加写入到旧表中
with pd.ExcelWriter('path_to_file.xlsx', mode='a') as writer:
		# 保存df到Sheet1中
		df.to_excel(writer, sheet_name='Sheet1')
		df.to_excel(writer, sheet_name='Sheet2')

建议

  1. 在单独处理每一行数据时,尽量将数据向量化处理,如果有条件尽量转化为numpy处理(df.values)
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 11, size=(1000000, 5)), columns=('a','b','c','d','e'))
def func(a,b,c,d,e):
    if e == 10:
        return c*d
    elif (e < 10) and (e>=5):
        return c+d
    elif e < 5:
        return a+b
        
# 方法一:耗时18.4s
df['new'] = df.apply(lambda x: func(x['a'], x['b'], x['c'], x['d'], x['e']), axis=1)

# 方法二:耗时74.9ms
df['new'] = df['c'].values * df['d'].values #default case e = =10
mask = df['e'].values < 10
df.loc[mask,'new'] = df['c'] + df['d']
mask = df['e'].values < 5
df.loc[mask,'new'] = df['a'] + df['b']

posted on 2022-10-06 15:16  Duke D  阅读(276)  评论(0编辑  收藏  举报