pandas
to_numeric:类别离散化
参数 描述
arg scalar, list, tuple, 1-d array, or Series
errors {‘ignore’, ‘raise’, ‘coerce’}, default ‘raise’
downcast {‘integer’, ‘signed’, ‘unsigned’, ‘float’} , default None,指定转换的类型,默认返回float64或int64
1 | '1.0', '2', -3]) s = pd.Series([ |
总结: errors一般采用"ignore"或者"coerce";downcast按照需求来填写
缺失值(空值)处理
相关函数
- df.dropna()
- df.fillna()
- df.isnull()
- df.isna()
相关概念
- 空值:在pandas中的空值是""
- 缺失值:在dataframe中为nan或者naT(缺失时间),在series中为none或者nan即可
dropna删除缺失数据
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
, 函数作用:删除含有空值的行或列
- how:"all"表示这一行或列中的元素全部缺失(为nan)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列
- thresh:一行或一列中至少出现了thresh个才删除。
- subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
- inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。
默认参数:删除行,只要有空值就会删除,不替换。
Fillna填充缺失数据
处理Series对象
1 | import pandas as pd |
处理DataFrame对象
-
为所有的NaN的位置填充一个确定值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import pandas as pd
from numpy import nan as NaN
df = pd.DataFrame([[1, NaN, 2, 3, NaN], [1, 2, NaN, 3, NaN]])
print(df)
print("-"*10)
df = df.fillna(5)
print(df)
"""
0 1 2 3 4
0 1 NaN 2.0 3 NaN
1 1 2.0 NaN 3 NaN
----------
0 1 2 3 4
0 1 5.0 2.0 3 5.0
1 1 2.0 5.0 3 5.0
""" -
通过字典为不同的列填充不同的常数
1
2
3
4
5
6
7
8
9
10
11
12
13
14df = pd.DataFrame([[1, NaN, 2, 3, NaN], [1, 2, NaN, 3, NaN]], columns=["1st", "2nd", "3rd", "4th", "5th"])
print(df)
print("-"*10)
df = df.fillna({"5th": 100})
print(df)
"""
1st 2nd 3rd 4th 5th
0 1 NaN 2.0 3 NaN
1 1 2.0 NaN 3 NaN
----------
1st 2nd 3rd 4th 5th
0 1 NaN 2.0 3 100.0
1 1 2.0 NaN 3 100.0
"""
method参数:改变替代值的方式,当为’ffill’,表示用前面的值填充,当’bfill’表示用后面的值填充。
1 | df = pd.DataFrame([[1, NaN, 2, 3, NaN], [1, 2, NaN, 3, NaN]], columns=["1st", "2nd", "3rd", "4th", "5th"]) |
参数:
- method:FillnaOptions,ffill/forwardfill:用缺失值前面的一个值代替缺失值;bfill/backfill,缺失值后面的一个值代替前面的缺失值。注意这个参数不能与value同时出现(value:需要用什么值去填充缺失值)
- axis:参数默认为0,即沿着行填充,为1则沿着列填充
- limit:传入
limit
限制填充个数 - inplace:传入inplace参数:是否在原来的数据上操作,默认为False,表示重新拷贝了一份数据,然后在拷贝的数据上操作。
DateFrame操作
添加行
**添加一行:**采用loc[]
方法
1 | # 构造一个空的dataframe |
添加多行==>(合并另一个dateframe):
1 | # 1. 采用append方法合并两个dataframe |
添加列
采用df[]
方法直接在列上操作
1 | # 新建一个dataframe |
采用insert()
方法(过时deprecated)
1 | # 使用方法是DataFrame.insert(loc, column, value, allow_duplicates=False) |
合并多个DataFrame
https://blog.csdn.net/milton2017/article/details/54406482/
获得满足条件的行或者列
1 | # 获取DataFrame中numTest列的值大于2的行内容 |
-
直接筛选
直接使用列需要满足的条件,如果需要多个列同时满足条件,使用’&‘符号连接即可;如果只需要某一列满足条件,则使用’|'连接多个列的条件。
1
2
3
4
5
6
7
8some = all_data[(all_data['User_id'] == 1439408) & (all_data['Date'].isna())]
print(some)
# 得到了User_id=1439408和Date为空的数据项
User_id Merchant_id Coupon_id Discount_rate Distance Date_received Date
1 1439408 4663 11002.0 150:20 1.0 20160528.0 NaN
2 1439408 2632 8591.0 20:1 0.0 20160217.0 NaN
3 1439408 2632 1078.0 20:1 0.0 20160319.0 NaN
4 1439408 2632 8591.0 20:1 0.0 20160613.0 NaN -
基于map筛选
1
2
3
4
5
6
7
8
9
10
11user_requried = all_data['User_id'].map(lambda x : x==1439408)
date_requried = all_data['Date'].map(lambda x : np.isnan(x))
some = all_data[user_requried & date_requried]
print(some)
# 结果:其中map返回的值必须是bool类型,即某一个条件。然后使用直接筛选的方式,把条件合并,最终得出筛选的结果。我认为使用此种类型的方法更加的优美。
User_id Merchant_id Coupon_id Discount_rate Distance Date_received Date
1 1439408 4663 11002.0 150:20 1.0 20160528.0 NaN
2 1439408 2632 8591.0 20:1 0.0 20160217.0 NaN
3 1439408 2632 1078.0 20:1 0.0 20160319.0 NaN
4 1439408 2632 8591.0 20:1 0.0 20160613.0 NaN -
基于query方法筛选
直接写表达式,得出想要筛选的结果。
1
2
3some = all_data.query('(User_id == 1439408)')
print(some)
#结果:直接写表达式容易触发一些不必要的问题(值的类型容易出错,一些特殊值的表达困难等),所以并不建议使用这样的方法。
总结:
- 确定一个条件–> df[‘money’]>10000)
- 确定满足条件的行–> df[(df[‘money’]>10000)]
- 确定这些行的index–> df[(df[‘money’]>10000)].index.tolist(), 返回的是一个list
选取指定列展示
1 | #选取指定的列, 中间写的是条件, 类比 df = df[ df["sale"] > 50 ] |
Jieba
文本类的数据分析,一般都是分词+词云展示
1 | import jieba |
WordCloud
将数据保存后就要进行可视化展示,一般文本类的都会采用词云
1 | from wordcloud import WordCloud |
Author: Mrli
Link: https://nymrli.top/2021/12/26/Python科学计算常用API记录/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.