Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Python科学计算常用API记录

2021/12/28 Python
Word count: 2,091 | Reading time: 10min

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>>> s = pd.Series(['1.0', '2', -3])
>>> pd.to_numeric(s)
0 1.0
1 2.0
2 -3.0
dtype: float64
>>> pd.to_numeric(s, downcast='float')
0 1.0
1 2.0
2 -3.0
dtype: float32
>>> pd.to_numeric(s, downcast='signed')
0 1
1 2
2 -3
dtype: int8
>>> s = pd.Series(['apple', '1.0', '2', -3])
>>> pd.to_numeric(s, errors='ignore')
0 apple
1 1.0
2 2
3 -3
dtype: object
>>> pd.to_numeric(s, errors='coerce')
0 NaN
1 1.0
2 2.0
3 -3.0
dtype: float64

总结: 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
2
3
4
5
6
7
import pandas as pd
from numpy import nan as NaN

s = [1, NaN, 2, 3, NaN]
df = pd.Series(s)
df = df.fillna(5)
print(df)

处理DataFrame对象

  1. 为所有的NaN的位置填充一个确定值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import 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
    """
  2. 通过字典为不同的列填充不同的常数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    df = 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
df = 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(method="ffill") # bfill
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 NaN
1 1 2.0 2.0 3 NaN
"""

df = 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(method="bfill") # bfill
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 2.0 2.0 3 NaN
1 1 2.0 NaN 3 NaN
"""

参数:

  • method:FillnaOptions,ffill/forwardfill:用缺失值前面的一个值代替缺失值;bfill/backfill,缺失值后面的一个值代替前面的缺失值。注意这个参数不能与value同时出现(value:需要用什么值去填充缺失值)
  • axis:参数默认为0,即沿着行填充,为1则沿着列填充
  • limit:传入limit限制填充个数
  • inplace:传入inplace参数:是否在原来的数据上操作,默认为False,表示重新拷贝了一份数据,然后在拷贝的数据上操作。

DateFrame操作

添加行

**添加一行:**采用loc[]方法

1
2
3
4
5
6
# 构造一个空的dataframe
import pandas as pd
df = pd.DataFrame(columns=['name','number'])
# 采用.loc的方法进行
df.loc[0]=['cat', 3] # 其中loc[]中需要加入的是插入地方dataframe的索引,默认是整数型
# 也可采用诸如df.loc['a'] = ['123',30]的形式

添加多行==>(合并另一个dateframe):

1
2
3
4
5
6
7
8
9
10
11
# 1. 采用append方法合并两个dataframe
# 构造两个dataframe
df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB'))
df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB'))
# 合并 ignore_index设置为 True可以重新排列索引
df.append(df2, ignore_index=True)
A B
0 1 2
1 3 4
2 5 6
3 7 8

添加列

采用df[]方法直接在列上操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建一个dataframe
df = pd.DataFrame(columns=['name','number'], data=[['cat',3]])
"""
df
name number
0 cat 3
"""
# 添加一列,计算有多少条腿
df['leg'] = df['number'] * 4
# 添加一列,直接赋值有几个头
df['head'] = 1
"""
df
name number leg head
0 cat 3 12 1
"""

采用insert()方法(过时deprecated)

1
2
3
4
5
6
# 使用方法是DataFrame.insert(loc, column, value, allow_duplicates=False)
# 即df.insert(添加列位置索引序号,添加列名,数值,是否允许列名重复)
df.insert(1, 'tail', 1, allow_duplicates=False)
df
name tail number leg head
0 cat 1 3 12 1

合并多个DataFrame

https://blog.csdn.net/milton2017/article/details/54406482/

获得满足条件的行或者列

1
2
3
4
5
6
# 获取DataFrame中numTest列的值大于2的行内容
arr1 = arr[arr['numTest']>2]
print(arr1)
# 获取哪几行符合条件,也就是获取符合条件的行的索引值
result = arr[arr['numTest']>2].index.tolist()
print(result)
  • 直接筛选

    直接使用列需要满足的条件,如果需要多个列同时满足条件,使用’&‘符号连接即可;如果只需要某一列满足条件,则使用’|'连接多个列的条件。

    1
    2
    3
    4
    5
    6
    7
    8
    some = 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
    11
    user_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
    3
    some = all_data.query('(User_id == 1439408)')
    print(some)
    #结果:直接写表达式容易触发一些不必要的问题(值的类型容易出错,一些特殊值的表达困难等),所以并不建议使用这样的方法。

总结:

  • 确定一个条件–> df[‘money’]>10000)
  • 确定满足条件的行–> df[(df[‘money’]>10000)]
  • 确定这些行的index–> df[(df[‘money’]>10000)].index.tolist(), 返回的是一个list

选取指定列展示

1
2
#选取指定的列, 中间写的是条件, 类比 df = df[ df["sale"] > 50 ]
df = df[ ["sku","ebayno","sale"] ]

Jieba

文本类的数据分析,一般都是分词+词云展示

1
2
3
4
5
6
7
import jieba

data = pd.read_csv(data_path)
all_content = ''
for i in range(0, len(data['评论标题'])):
all_content = all_content + data['评论标题'][i]
cut_text = " ".join(jieba.cut(all_content))

WordCloud

将数据保存后就要进行可视化展示,一般文本类的都会采用词云

1
2
3
4
5
6
7
8
9
10
11
12
13
from wordcloud import WordCloud

wordcloud = WordCloud(font_path=ciyunfont_path, mask=background_image, background_color='white').generate(cut_text)
plt.figure(figsize=(8, 8))
if not os.path.exists(result_path):
os.makedirs(result_path)
# 保存生成图片
plt.savefig(f'{result_path}/ciyun.png')
# 指定词云图为待显示的图片
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
# 显示图片
plt.show()

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.

< PreviousPost
开发过程中Mysql API记录
NextPost >
Python中关于图片的操作
CATALOG
  1. 1. pandas
    1. 1.1. to_numeric:类别离散化
    2. 1.2. 缺失值(空值)处理
      1. 1.2.1. dropna删除缺失数据
      2. 1.2.2. Fillna填充缺失数据
    3. 1.3. DateFrame操作
      1. 1.3.1. 添加行
      2. 1.3.2. 添加列
    4. 1.4. 合并多个DataFrame
      1. 1.4.1. 获得满足条件的行或者列
      2. 1.4.2. 选取指定列展示
  2. 2. Jieba
  3. 3. WordCloud