CTR场景数据分析建模 问题汇总1-pandas及python操作

pandas DataFrame格式

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html
这是pandas独有的格式,内置了很多函数,sklearn可以处理dataframe

https://blog.csdn.net/tanlangqie/article/details/78656588
dataframe常见操作

重命名特定列

https://stackoverflow.com/questions/11346283/renaming-columns-in-pandas
DataFrame格式 rename函数

#没有inplace=True就是生成一个返回值copy,需要赋值
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# inplace=True就是覆盖原DataFrame
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

valuEerror :range parameter must be finite

python中用pyplot来画直方图,出现了这个报错
原因是数列中出现了nan 或者 inf

解决办法1 fillna 在我前一篇blog有提及(推荐方法)
解决办法2 只画出非nan inf值
https://stackoverflow.com/questions/51642846/python-histogram-valueerror-range-parameter-must-be-finite

import numpy as np
df[np.isfinite(df['distance'])]

plt.hist(df[np.isfinite(df['distance'])].values)

Python replace()方法

针对字符串
replace()方法语法:
str.replace(old, new[, max])
参数
old – 将被替换的子字符串。
new – 新字符串,用于替换old子字符串。
max – 可选字符串, 替换不超过 max 次

Pandas Series.nunique() 用法

部分转自 :https://blog.csdn.net/lomodays207/article/details/87159448
在分析数据时,很多时候用户想要查看特定列中的唯一值。 Pandas nunique() 用于获取唯一值的统计次数。
在这里插入图片描述
dropna 默认参数设置为True,因此在计算唯一值时排除了NULL值。

比nuinque()这个函数分别统计每一列属性各自有多少个不同值。比如一个月内的day属性 nuinque()后就只有30,因为所有数据都是30天内的

>>> df=pd.DataFrame({'A':[1,1,2],
                     'B':[4,5,6]})
>>> df.nunique()
A    2
B    3
dtype: int64 

axis=0 or 1?

问题:
python中的axis究竟是如何定义的呢?他们究竟代表是DataFrame的行还是列?考虑以下代码:

>>>df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], \
columns=["col1", "col2", "col3", "col4"])
>>>df
   col1  col2  col3  col4
    0     1     1     1     1
    1     2     2     2     2
    2     3     3     3     3

如果我们调用df.mean(axis=1),我们将得到按行计算的均值

>>> df.mean(axis=1)
0    1
1    2
2    3

#然而,如果我们调用 df.drop((name, axis=1),我们实际上删掉了一列,而不是一行:

>>> df.drop("col4", axis=1)
   col1  col2  col3
0     1     1     1
1     2     2     2
2     3     3     3

也许简单的来记就是axis=0代表往跨行(down),而axis=1代表跨列(across),作为方法动作的副词

换句话说:

使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签模向执行对应的方法
下图代表在DataFrame当中axis为0和1时分别代表的含义:
在这里插入图片描述
axis参数作用方向图示
另外,记住,Pandas保持了Numpy对关键字axis的用法,用法在Numpy库的词汇表当中有过解释:

轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。

所以问题当中第一个例子 df.mean(axis=1)代表沿着列水平方向计算均值,而第二个例子df.drop(name, axis=1) 代表将name对应的列标签(们)沿着水平的方向依次删掉。
具体问题具体分析,个人认为mean这种还是需要记下来。
https://www.cnblogs.com/rrttp/p/8028421.html

画分布统计图

https://www.yiibai.com/pandas/python_pandas_visualization.html
链接比较全

这里写下我的画分布图方法:

plt.clf()
plt.figure(figsize=(12,10))
plt.subplot(2,1,1)
data_lxy['day'].plot()
plt.title("UserInfo_259")
#plt.show()
#plt.clf()
#画分布图
plt.subplot(2,1,2)
max_data = data_lxy['day'].max()
bins = np.linspace(0, max_data, max_data+1)
plt.hist(data_lxy['day'], bins, normed=True, color="#FF0000", alpha=.9, histtype="stepfilled")
plt.show()

plt.clf()为清屏函数,清除屏幕
plt.subplot(2,1,1)同matlab,2*1的第1辐 不再赘述

-numpy.linspace(start, stop[, num=50[, endpoint=True[, retstep=False[, dtype=None]]]]])
返回在指定范围内的均匀间隔的数字(组成的数组),也即返回一个等差数列

start - 起始点,

stop - 结束点

num - 元素个数,默认为50,

endpoint - 是否包含stop数值,默认为True,包含stop值;若为False,则不包含stop值

retstep - 返回值形式,默认为False,返回等差数列组,若为True,则返回结果(array([samples, step])),

dtype - 返回结果的数据类型,默认无,若无,则参考输入数据类型。

plt.hist画直方图,横轴为取值,纵轴为占比频率
上下两图例子:
在这里插入图片描述

np 变量排序、集合运算、获取数组(矩阵)值不为0的元素下标

排序

numpy对向量进行排序,输出最大的前几位
https://blog.csdn.net/TH_NUM/article/details/85096811

a=np.array([1,12,13,14,5,6,7,8])

argsort_a =np.argsort(a)

print("argsort_a,从小到大的index:",argsort_a)
e= argsort_a[::-1]
print("最大的5位的index:",e[:5])
argsort_a,从小到大的index: [0 4 5 6 7 1 2 3]
最大的5位的index: [3 2 1 7 6]

集合运算

https://blog.csdn.net/tcy23456/article/details/83958753
用了 setdiff1d(x,y) 集合差,即元素在x中且不在y中

获取非零下标

http://rootlu.com/blog/2017/10/22/PythonNonzero.html/
np.nonzeros(m)返回m中值不为零的元素的下标,返回值是一个长度为m.ndim(m的轴数)的元组。
元组的每个元素都是一个整数数组,其值为非零元素的下标在对应轴上的值。

本人使用时,搭配nonzeros和setdiff1d来把0元素的下标提取出来。

reset_index

pandas contact 之后,一定要记得用reset_index去处理index,不然容易出现莫名的逻辑错误
https://blog.csdn.net/lujiandong1/article/details/52929090
在这里插入图片描述
容易出现如上图所示的问题,编号乱了,也可添加
result = pd.concat(frames,ignore_index=True)
或result = df1.append([df2,df3],ignore_index=True)解决

Python map() 函数

https://www.runoob.com/python/python-func-map.html
描述
map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

语法
map() 函数语法:

map(function, iterable, …)
参数
function – 函数
iterable – 一个或多个序列
返回值
Python 2.x 返回列表。

Python 3.x 返回迭代器。

与lambda联动

>>>  squares = map(lambda x:x**2,range(5))
>>> squares
[0, 1, 4, 9, 16]

map(python) 与 apply applymap(pandas)区别

https://www.cnblogs.com/cymwill/p/7577369.html 可以一看
总结:

apply
用在dataframe上,用于对row或者column进行计算;!!!

applymap
用于dataframe上,是元素级别的操作;

map
(其实是python自带的)用于series上,是元素级别的操作。

apply例子 对列做样本数量统计

day_count_dict = dict(data_lxy.day.value_counts())#分day属性统计数量 
#例: 1: 52,第一天有52条 2: 93,第2天93条
def day_before_count(day):
    day_before_sum = 0
    day_before_list = list(range(1,day+1))
    for i in day_before_list:
        day_before_sum += day_count_dict[i]
    return day_before_sum
    # day1 52 day2 52+93=145
data_lxy['day_before_count'] = data_lxy.apply(lambda x:day_before_count(int(x['day'])), axis = 1 ) #作用在一行上 新建特征

注意区分Series的map的区别。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html

Python使用combinations实现排列组合

https://blog.csdn.net/cloume/article/details/76399093
后面参数是2就是两两组合,3就是三个组合

from itertools import combinations
test_data = ['a', 'a', 'a', 'b']
for i in combinations(test_data, 2):
    print i
('a', 'a')
('a', 'a')
('a', 'b')
('a', 'a')
('a', 'b')
('a', 'b')

python join方法 连接字符串

https://www.runoob.com/python/att-string-join.html
描述
Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。

语法
join()方法语法:

str.join(sequence)
参数
sequence – 要连接的元素序列。
返回值
返回通过指定字符连接序列中元素后生成的新字符串。

str = "-";
seq = ("a", "b", "c"); # 字符串序列
print str.join( seq );

Pandas 合并多个Dataframe merge

https://www.jb51.net/article/141672.htm
df = pd.merge(df1, df2, how=‘left’, on=‘user_id’)
用法很简单,说一下后两个参数就可以了,how=""参数表示以哪个表的key为准,上面的how=“left"表示以表df1为准,而key也就是on=”"的参数

how="left"就是说,保留user_id字段的全部信息,不增加也不减少,但是拼接的时候只把df2表中的与df1中user_id字段交集的部分合并上就可以了,如果df2中出现了某个user_id在df1中没有出现,就抛弃掉这个样本不作处理。
即以left左边的df1为准

如果要进行多key合并:

df = pd.merge(df1, df2, how=‘left’, on=[‘user_id’,‘sku_id’])

Pandas分组 groupby

https://www.yiibai.com/pandas/python_pandas_groupby.html
任何分组(groupby)操作都涉及原始对象的以下操作之一。它们是 -

分割对象
应用一个函数
结合的结果

在许多情况下,我们将数据分成多个集合,并在每个子集上应用一些函数。在应用函数中,可以执行以下操作 -
聚合 - 计算汇总统计
转换 - 执行一些特定于组的操作
过滤 - 在某些情况下丢弃数据

将数据拆分成组比较常见
代码中

temp = data.groupby(features).size().reset_index().rename(columns={0: new_feature})

data.groupby(features):相当于将data中以features的不同分组
size(): 并计算每组的样本数量(即出现过本组features的样本数量)
reset_index():重新得到序号
rename:改变列名

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值