文章目录
- 1. python基础语法
- 1.1 怎么让两个list或者其它可以迭代的放到一起
- 1.2 random.choice(x, n, replace=True) numpy中从某个数据集中选择
- 1.3 如何根据key返回字典的value
- 1.4 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
- 1.5 到底是.xxx呢还是.xxx()呢??
- 1.6 list and generator and any(iterable) all(iterable)
- 1.7 globals 获取全局的变量/函数/类
- 1.8 a = a.append(3)这件事
- 1.9 <class "NoneType">
- 1.10时间格式的整理
- 时间格式转换 str --> datetime or datetime --> str
- 时间格式的加减(加秒/加小时/加天/周/月等)
- 时间格式的提取(比如将dataframe中某一列设为周)
 
 
- 2. numpy
- 2.1 numpy中如何使得维度降低维度
- 2.2. np.bincount()
- 2.3 numpy里的高级索引
- 2.4. np.unique()
- 2.5 re.sub(pattern, repl, string, count=0, flags=0)
- 2.6 设置展示行(列也是同理的,可以自己去查)
- 2.7 ~的作用
 
- 3. pandas
- 3.1 查看某行是不是有重复值
- 3.2 df.value_counts(normalize: bool = False,sort: bool = True,ascending: bool = False,bins=None, dropna: bool = True)
- 3.3 报错 Traceback (most recent call last): parser = TextFileReader(filepath_or_buffer, **kwds) self._engine = self._make_engine(self.engine)
- 3.4 存储为csv后科学计数法的问题
- 3.5 读json格式
- 3.6 查看完整的错误信息
- 3.7 多条件索引
- 3.8 读excel某几行
- 3.9 df['xxx'].values
- 3.10 df.dtypes
- 3.11 删除多列同时为0的行
- 3.12创建dataframe的方式
- 3.13 Series访问
- 3.14 iloc和loc
 
1. python基础语法
1.1 怎么让两个list或者其它可以迭代的放到一起
可以使用zip
 可以使用索引
for i in range(len(xxx)):list[i]
1.2 random.choice(x, n, replace=True) numpy中从某个数据集中选择
不是随机random.int() 而是从既有数据集中选择!
1.3 如何根据key返回字典的value
精髓就在于,直接封装成方法!
 这样就可以直接调用了!!
def return_key(levels_dict, target):for key, value in levels_dict.items():if value == target:return keyreturn "ERROR"return_key(levels_dict, val)
1.4 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
元素除了是 0、空、FALSE 外都算 TRUE。
注意针对的是可迭代的对象!
1.5 到底是.xxx呢还是.xxx()呢??
是不是经常会有疑问,到底加不加括号!
 其实这个可以通过经验来获得!
 如果我们想返回的是值,比如df.columns,那么多半是不加括号的;
 而如果是一个功能,比如sort,那么就需要加括号
1.6 list and generator and any(iterable) all(iterable)
如果是any和all则选用generator
 因为只要判断了第一个满足条件或者不满足条件就可以返回了,list则要全部访问完
 any(i for i in range(n)) # 就是一个括号
 any([i for i in range(n)])
1.7 globals 获取全局的变量/函数/类
链接
链接
一句话: 就是会返回所有全局变量的一个字典, key值为该变量的命名;
 这里的全局变量包含了:
 **导入的包! 导入的函数! **
 如果是在某个函数中,则包含了局部变量(参数);
 如果是在类中,则包含了定义的实例变量.
在调用的时候,由于globals()是一个字典,所以先加key值,再写参数
train_dataset = globals()[dataset_name](conf, conf.data.train_json_files, generate_dict=True)
1.8 a = a.append(3)这件事
    loc_level = [level_levelid[i][0] for i in range(idx+1)]\.append(ll[1])print(loc_level)  # None## 正确loc_level = [level_levelid[i][0] for i in range(idx+1)]loc_level .append(ll[1])print(loc_level)  # 
好像没错,但是其实错了 ! 因为这个时候a被赋值是append()函数
 这个函数是inplace的,不需要重新定义,没有返回值,肯定为None
1.9 <class “NoneType”>
一般是函数的输出会是NoneType
 判断方式:
a is None
1.10时间格式的整理
时间格式转换 str --> datetime or datetime --> str
需要的函数:
import datetime时间格式的加减(加秒/加小时/加天/周/月等)
datetime.timedelta(
[days
[, seconds
[, microseconds
[, milliseconds
[, minutes
[, hours
[, weeks
]]]]]]])now=datetime.datetime.now()
now
datetime.datetime(2018, 1, 20, 11, 5, 18, 227000)
delta=datetime.timedelta(days=1)
delta
datetime.timedelta(1)
newtime=now+delta时间格式的提取(比如将dataframe中某一列设为周)
2. numpy
2.1 numpy中如何使得维度降低维度
降低维度到1维
x = x.reshape(-1)x = x.flatten()
2.2. np.bincount()
-  解释 
 这是一个加权对同类累加的函数 ! 当然是同类的加权! 同时是降序返回
-  参数 
 x
 weights(optional): array of the same shape asx,默认是1
 minlength(optional):
-  举例 
 x: array([2, 2, 0, 2, 0, 0, 1, 1, 2, 1, 1, 0, 1, 1, 0, 1, 2, 2, 0])
 weights: array([0.4, 0.4, 0.2,0.2, …])
x * weights 后对同类进行累加并返回
 所以返回的是三个数 [x_1, x_2, x_3] 2/1、0的加权和
- 应用场景
 一般用在求概率上!
 比如gini系数!
   def gini(y):# Gini impurity (local entropy) of a label sequencehist = np.bincount(y)N = np.sum(hist)return 1 - sum([(i / N) ** 2 for i in hist])
2.3 numpy里的高级索引
- 支持索引查找
 x[[1,2,3], [2,3,4]]
 或者是x[1,2,3] 表示取的是array x的索引为1,2,3的数组
2.4. np.unique()
去重以及排序
2.5 re.sub(pattern, repl, string, count=0, flags=0)
re.sub的参数:5个参数
参数1:pattern
 表示正则中的模式字符串。
 参数2:repl
 就是replacement,表示被替换的字符串,可以是字符串也可以是函数。
 参数3:string
 表示要被处理和替换的原始字符串
 参数4:count
 可选参数,表示是要替换的最大次数,而且必须是非负整数,该参数默认为0,即所有的匹配都会被替换;
 参数5:flags
 可选参数,表示编译时用的匹配模式(如忽略大小写、多行模式等),数字形式,默认为0。
import rere.sub('[,]', ',', str1)  # a = '   (rr 我)#1  (d 只是)#1  (p 以)#1  (vi 笑) (v 作答)#1#2#3 (。 。)'
a = re.sub(u"[\u4e00-\u9fa5]+", '*', a) # 匹配多个连续汉字,替换为*
2.6 设置展示行(列也是同理的,可以自己去查)
pd.options.display.max_rows = None
pd.set_option('display.max_rows', 200)
每次运行前都要重新设置!
2.7 ~的作用
~就是取反,只能用于numpy,list是不行的! 当然用到dataframe也是可以的,因为它每个单元格都是ndarray
 ~np.array([True, ])
3. pandas
3.1 查看某行是不是有重复值
是否有重复行
 any(df.duplicated())
 可以用于某一列有重复值
查看重复的行
 df[df.duplicated()]
 去除重复行
 df.drop_duplicats(subset = [‘price’,‘cnt’],keep=‘last’,inplace=True)
 drop_duplicats参数说明:
 subset subset用来指定特定的列,默认所有列
 keep keep可以为first和last,表示是选择最前一项还是最后一项保留,默认first
 inplace inplace是直接在原来数据上修改还是保留一个副本,默认为False
3.2 df.value_counts(normalize: bool = False,sort: bool = True,ascending: bool = False,bins=None, dropna: bool = True)
记住返回的是series! int类型,虽然显示的是text + id
 还可以实现mean!
  Examples-------->>> index = pd.Index([3, 1, 2, 3, 4, np.nan])>>> index.value_counts()3.0    21.0    12.0    14.0    1dtype: int64With `normalize` set to `True`, returns the relative frequency bydividing all values by the sum of values.>>> s = pd.Series([3, 1, 2, 3, 4, np.nan])>>> s.value_counts(normalize=True)3.0    0.41.0    0.22.0    0.24.0    0.2dtype: float64**bins**Bins can be useful for going from a continuous variable to acategorical variable; instead of counting uniqueapparitions of values, divide the index in the specifiednumber of half-open bins.>>> s.value_counts(bins=3)(0.996, 2.0]    2(2.0, 3.0]      2(3.0, 4.0]      1dtype: int64**dropna**With `dropna` set to `False` we can also see NaN index values.>>> s.value_counts(dropna=False)3.0    21.0    12.0    14.0    1NaN    1dtype: int64"""
3.3 报错 Traceback (most recent call last): parser = TextFileReader(filepath_or_buffer, **kwds) self._engine = self._make_engine(self.engine)
- 错误分析
 这是因为pd.read_csv()代码运行出错!
 最可气的是出现上面的错误,pandas不显示全部的出错信息,而且出奇的一致,你也不知道你哪个参数写错了!
 但是注意这里出错只有一种可能是你的参数写错了!

- 运行代码
pd.read_csv('../data/type_count2.csv', encoding='GBK')
或者
pd.read_csv('../data/type_count2.csv', encoding='utf-8')
或者
pd.read_csv('../data/type_count2.csv', encoding='utf-8', sep='\t')
-  出错原因: 
-  第一: 最重要的看看路径!!!! 
 一般都是路径引起的!! 给我回去一层一层的看
-  第二: encoding 
 如果上面没有错误,那么请看编码问题! UTF-8或者是GBK
-  第三: sep 
 默认是逗号,如果有问题,一定尝试别的’\t’
-  小技巧:查看完整错误信息 
try:pd.read_csv('../data/xx')
except Exception as e:print(e.args)print('=======')print(traceback.format_exc())

3.4 存储为csv后科学计数法的问题
- 场景分析
 主要是想保存csv或者是excel,但是某一列既有字符串,又有(int),而且int还是长int; 由于csv中自动保存使用科学计数法!
 这是csv或者excel的显示问题,不是
  
方法解决:
- 方法一:就这样吧
 链接
 Excel打开CSV数字显示为科学计数法解决办法 
压根不要着急! 虽然它在csv或者是excel中是科学计数法,但是精度并没有丢失!!!!!!
 前提是你不要点ctrl+s;
 你读的时候数据还是原封不动的,所以没有必要慌张
如果点ctrl+S保存,会直接保存更改精度后的数据!!
- 方法二:转变csv的格式
 如果真的想保存为非科学计数法,可以尝试这个方法
分隔符选择为’,'(因为to_csv默认是逗号)
 
 注意三列都需要设置哦!!!
 
这样就可以了!!
- 方法三:保存为txt格式
 这种直接保存为txt格式,就不会受到csv格式的制约了!
df_.to_csv('tt.txt', endoing='utf-8', sep='\t')
- 方法四: 对每一行多一个字符
 如果我们在保存的时候多加一个字符自动转为字符串!
 注意,就算我们使用
df['xxx'] = df['xxx'].astype(str) 
或者是
df['xxx'] = df['xxx'].apply(lambda x: str(x)) 
都是无济于事的
因为它本来就是str,但是在转为csv的时候还是会以同样的方式把它认为int! giao!
 所以要这样
# 写端:
df['xxx'] = df['xxx'].apply(lambda x: str(x) + '\t') 
或者是
df['xxx'] = df['xxx'].apply(lambda x: str(x) + ' ') 
# 读端:
df['xxx'] = df['xxx'].apply(lambda x: s.strip() 
这样你保存的时候就不会显示为科学计数法了!!
3.5 读json格式
panads同样可以读json! 不需要用json.loads(xxx)
 前提:json中每个字典对象都要有相同的ziduan
with open('tt.json', 'r', encoding='utf-8') as file:json_info = file.read()
df = pd.read_json(json_info)
- groupby + reset_index + sort_values
df2_ = df.groupby(['channelid','type',])['count'].sum().reset_index().sort_values(['type', 'count'], ascending=False)
使用某两列进行分组生成了groupby对象,该对象以[‘channelid’,‘type’] 为索引, 属性是其它属性,然后再对count列求和!!!
 
 reset_index()使得index为列!
再以两列排序!!
3.6 查看完整的错误信息
try:pd.read_csv('../data/xx')
except Exception as e:print(e.args)print('=======')print(traceback.format_exc())

3.7 多条件索引
必须使用 “&”, 而不是and
data_counts[(data_counts['数量']>100) & (data_counts['数量']<500)]
3.8 读excel某几行
pandas.read_excel(io,
sheet_name=0,
header=0,      # 第几行为列名
names=None,    # 新的列名
index_col=None,
usecols=None,  # 几列
squeeze=False,
dtype=None,
engine=None,converters=None,true_values=None,
false_values=None,
skiprows=None, # 跳过第几行
nrows=None,    # 读多少行
na_values=None,keep_default_na=True,
verbose=False,parse_dates=False,date_parser=None,
thousands=None,
comment=None,skip_footer=0,skipfooter=0,
convert_float=True,mangle_dupe_cols=True,**kwds)
如果只读某几行,比如第一行我们是不需要的,那么就skiprows = 1
 
3.9 df[‘xxx’].values
- dataframe格式
 我们在展示某列的时候不想要其index,只想获得值,这个时候就可以使用values
- series格式
 其实,某一列就是要给series,series就相当于是一个有index的array,当取values的时候,就和array一样的!
3.10 df.dtypes
展示df每一列的数据类型
3.11 删除多列同时为0的行
dropna: 用于删除异常值的,包含NA的
 drop: 同上
columns = ['xx', 'xxx', ....]
data[(data.loc[:, columns]!=0).any(1)] # 
any() : 用于判断一个迭代对象是不是全部为True,否则为False
 any(iterable)
3.12创建dataframe的方式
链接

 
3.13 Series访问
series的索引访问! 都说series和ndarray一样, 但是其实也不一样! 因为ndarray通过切片下标来高级索引, 但是series还是得通过iloc或者loc****索引访问;
 其次要清楚, 索引(高级索引)返回的是拷贝;
 而切片访问返回的是视图!!!
series.iloc[[x, x, xx, x]] # 只需要写一个行就行,不需要全部!
链接
3.14 iloc和loc
iloc和loc都是通过所以来获取值的! 也就是行索引和列索引!
 如果是完全根据索引顺序访问, 每次在访问的时候一定要reset_index一下!
如果本身索引带了类别属性, 那么就自己考虑吧