pandas及numpy - 常用操作

20200808 -
这里主要记录一些关于pandas与numpy的基础操作,一些容易忘记,但偶尔会使用的操作。

操作列表

  1. 数据的读取
  2. 数据切片
  3. 数据的画图操作
  4. 字符串操作
  5. 修改数据
  6. 删除列(行)
  7. 数据显示不全(行)
  8. 根据规则修改列数据
  9. 将某列转换为时间索引
  10. 按照DF某行进行过滤
  11. Pandas Series转换为DataFrame
  12. 将一个列生成多个列
  13. 计算去重值的个数
  14. numpy的where
  15. DataFrame的复制问题
  16. 处理缺失值,无限值(展示缺失值的行)

1. 数据的读取

如果有文件是已经按照分隔符分割好的,直接使用read_csv即可;几种特殊情况:

  • 默认使用,作为分隔符,想修改的话在sep参数中指定;
  • 默认第一行是列名,但如果没有的话,要指定(header = None,names = [‘a’,‘b’])

2. 数据切片

注意:pandas的DataFrame可以使用按照数组区间式的切片,但如果指定单个数字的情况下下,会报错;而numpy的切片跟列表的相似,具体可以看文章[2]

基本操作就是按照列,按照行进行数据操作,这个过程可以看文章[1],文章[3]以文档的形式进行介绍,更正式一些。其中比较重要的函数就是iloc、loc,包括按照名字,按照数字,同时可以按照一些条件来筛选。

针对这部分进行一些简单的总结,就不用每次都去那个博客里面翻阅了。(2019/07/17)
1)取出列名:columns.tolist();取出行名:index.tolist()。
2)利用布尔值取出某些行,直接df[bool_list]即可。
3)利用列名列表进行提取,df.loc[:,col_list]
4)按照行名进行函数判断,例如某行中哪些列>0,df.loc[name] > 0,然后得到的列表是一个布尔的,将其用于3)即可

在利用布尔值来取出某些行的时候,如果是多个条件,就需要对这个条件进行限制,撰写方式是
df[(df['xxx'] > 10) & df['xxx'] < 10]具体见文章[17]。

3. 数据的画图操作

关于这部分内容,比较多;可以使用自带的plot函数,也可以使用seaborn的方式。后面用到了就添加。

4. 字符串操作

如果df中的某列是字符串类型的数据,可以用Series.str,也就是df[‘xxx’].str,自带很多函数。今天的使用范例是想分割,但个数的时候并不对,就直接使用了str.count,文章[4]简单介绍了这几个函数。
平时的时候,还是直接使用map方法,df['xxx'].map(lambda x: len(x))

5. 修改数据

遇到某种条件的时候,对某些数据进行修改。google上搜了一下,问答[5]的第一个回答非常不错。两个相同的df,但赋值的时候,只在切片的位置起作用。

6. 删除某列(行)

  • drop([‘xxx’,‘xxx2’],axis = 1)这种删除会返回删除后的df,但原始数据没变;如果想直接在数组上操作,要增加参数inplace=True[6]。
  • 想删除某行,按照某种条件,可以按照这种df.drop(df[df.score < 50].index, inplace=True)。[7]

7. 数据显示不全(行)[8]

pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)

8. 根据规则修改列数据[9]

前面5中提到了进行修改的一种范例,但这里的需求是,按照某一个行的内容,然后选择其他两行的数值,最后是用numpy的where函数实现;同时见过一个,利用apply函数的方式,但是这种方式非常耗时,这里就不记录了。

9. 将某列转换为时间索引[10]

先将该列利用to_datetime转换格式,然后利用set_index进行设置,添加inplace参数可以直接在当前df上生效。

df['date'] = pd.to_datetime(df['date'])
df.set_index("date", inplace=True)

10. 按照DF某行进行过滤[11]

这里主要的功能需要注意可以指定取值范围(集合类型)的过滤方法。

df[(True-df['appID'].isin([278,382]))&(True-df['appPlatform'].isin([2]))]

11. Pandas Series转换为DataFrame[12]

在利用value_counts函数来计数时,生成的结果是一个Series类型的数据,但是seaborn画图的时候,需要df,所以要将其进行转化。方法也比较简单。

# value_counts-> counts_res
tmp_dict = {"key":counts_res.index, "count":counts_res.values}
counts_df = pd.DataFrame(tmp_dict)

12. 将一个列生成多个列

介绍两种情况,本质上是一样的。

  • 字符串情况[13]
df = pd.DataFrame({"a":["Li si", "Wang wu"]})
df.head()

df[['One','Two']] = df.a.str.split(" ", expand=True)

expand参数必须添加。

  • 其他情况(数值,或函数)[14]

在问答[14]中,第二个回答是我使用的。

def powers(x):
	return x, x**2, x**3, x**4, x**5, x**6
df['p1'], df['p2'], df['p3'], df['p4'], df['p5'], df['p6'] =  zip(*df['num'].map(powers))

13. 计算去重值的个数

之前的时候,我记得我记录过这个东西,就是关于这部分内容的研究,但是忘了是什么结果了。这次来记录一下如果使用numpy的话,怎么来实现这个效果。来看问答[[15]的第二个回答,

import numpy as np
x = np.array([1,1,1,2,2,2,5,25,1,1])
unique, counts = np.unique(x, return_counts=True)
print np.asarray((unique, counts)).T

14. numpy的where

最近的任务中,经常会将某些标签提取出来单独分析,需要将某类符合条件的数据的索引提取出来,一直使用的方法就是np.where。下面来简单列举一下使用过的方法。
单个数值的索引获取

a = np.array([1,2,3,4,5])
a_index = np.where(a == 1)
# a_index = array([0])
get_a = a[a_index]

如果是多个数值的选取

a = np.array([1,2,3,4,5,1,3])
b = [1,2]
np.isin(a, b)
# array([ True,  True, False, False, False,  True, False])
index = np.where(np.isin(a,b))
# 如果是取反
index = np.where(~np.isin(a,b))

15. DataFrame的复制问题

该问题来源于,DataFrame的赋值过程中,是值传递,还是引用传递,通过查看文章[16]中的内容,可以知道,本质上DataFrame赋值是引用传递,如果想进行深复制,那么需要进行的方式就是

new_df = df.copy(deep=True)

这里并没有深入的进行解释,实际使用过程中,需要对这部分进行深入的思考,到底是使用浅复制还是深复制。

16. 处理缺失值,无限值

查看某个列是否存在缺失值:

df.isnull().any()
df.isna().any()

填充缺失值:

df.replace([np.inf, -np.inf, -np.nan], 0, inplace = True)

丢弃缺失值:

df.dropna(inplace = True)

查找pandas datafram中包含inf的单元格的行位置和列名
展示含有缺失值的行
Display rows with one or more NaN values in pandas dataframe
具体代码如下:

df1 = df[df.isna().any(axis=1)]

参考文章

[1]Python - pandas DataFrame 数据选取,修改,切片
[2]numpy之索引和切片
[3][Pandas]数据选取/数据切片
[4]pandas处理字符串1
[5]Update row values where certain condition is met in pandas
[6]Delete column from pandas DataFrame
[7]How to delete rows from a pandas DataFrame based on a conditional expression
[8]pandas查看数据,显示不全的问题解决,set_option参数
[9]某些列满足某些条件就被改是什么值,不满足就被改为另外的一些值
[10]pandas 将“字符类型的日期列”转化成“时间戳索引(DatetimeIndex)”
[11]pandas如何去掉、过滤数据集中的某些值或者某些行
[12]Pandas Series转换为DataFrame
[13]split-a-text-column-into-two-columns-in-pandas-dataframe/
[14]Apply pandas function to column to create multiple new columns?
[15]numpy: most efficient frequency counts for unique values in an array
[16]python中dataframe类型数据的复制
[17]python-pandas-select-rows-in-dataframe-by-conditions-on-multiple-columns

你可能感兴趣的:(机器学习,python,numpy,pandas)