20200808 -
这里主要记录一些关于pandas与numpy的基础操作,一些容易忘记,但偶尔会使用的操作。
如果有文件是已经按照分隔符分割好的,直接使用read_csv即可;几种特殊情况:
注意: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]。
关于这部分内容,比较多;可以使用自带的plot函数,也可以使用seaborn的方式。后面用到了就添加。
如果df中的某列是字符串类型的数据,可以用Series.str,也就是df[‘xxx’].str,自带很多函数。今天的使用范例是想分割,但个数的时候并不对,就直接使用了str.count,文章[4]简单介绍了这几个函数。
平时的时候,还是直接使用map方法,df['xxx'].map(lambda x: len(x))
遇到某种条件的时候,对某些数据进行修改。google上搜了一下,问答[5]的第一个回答非常不错。两个相同的df,但赋值的时候,只在切片的位置起作用。
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
前面5中提到了进行修改的一种范例,但这里的需求是,按照某一个行的内容,然后选择其他两行的数值,最后是用numpy的where函数实现;同时见过一个,利用apply函数的方式,但是这种方式非常耗时,这里就不记录了。
先将该列利用to_datetime转换格式,然后利用set_index进行设置,添加inplace参数可以直接在当前df上生效。
df['date'] = pd.to_datetime(df['date'])
df.set_index("date", inplace=True)
这里主要的功能需要注意可以指定取值范围(集合类型)的过滤方法。
df[(True-df['appID'].isin([278,382]))&(True-df['appPlatform'].isin([2]))]
在利用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)
介绍两种情况,本质上是一样的。
df = pd.DataFrame({"a":["Li si", "Wang wu"]})
df.head()
df[['One','Two']] = df.a.str.split(" ", expand=True)
expand
参数必须添加。
在问答[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))
之前的时候,我记得我记录过这个东西,就是关于这部分内容的研究,但是忘了是什么结果了。这次来记录一下如果使用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
最近的任务中,经常会将某些标签提取出来单独分析,需要将某类符合条件的数据的索引提取出来,一直使用的方法就是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))
该问题来源于,DataFrame的赋值过程中,是值传递,还是引用传递,通过查看文章[16]中的内容,可以知道,本质上DataFrame赋值是引用传递,如果想进行深复制,那么需要进行的方式就是
new_df = df.copy(deep=True)
这里并没有深入的进行解释,实际使用过程中,需要对这部分进行深入的思考,到底是使用浅复制还是深复制。
查看某个列是否存在缺失值:
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