这个笔记我打算专门用来记录我在数据分析以及数据预处理遇到的知识点

iloc与loc

loc和iloc都是pandas工具中定位某一行的函数,loc是location的意思,而iloc中的 i 指的是Integer,二者的区别如下:

  • loc:通过行标签名称索引行数据
  • iloc:通过行号索引行数据

示例数据

1
2
3
4
import numpy as np
import pandas as pd
data=DataFrame(np.arange(16).reshape(4,4),index=list("ABCD"),columns=list("wxyz"))
print(data)

输出如下:

1
2
3
4
5
    w   x   y   z
A 0 1 2 3
B 4 5 6 7
C 8 9 10 11
D 12 13 14 15

loc用法

1
2
3
4
5
6
7
8
9
10
print(data.loc["A"])
#w 0
#x 1
#y 2
#z 3
print(data.loc[["A"]])
# w x y z
#A 0 1 2 3

# []返回Series,[[]]返回DataFrame

iloc用法

1
2
3
4
5
6
7
8
9
10
11
print(data.iloc[0])
#w 0
#x 1
#y 2
#z 3
#print(data.iloc["A"])报错

print(data.loc[["A"]])
# w x y z
#A 0 1 2 3
#print(data.loc[0])报错
1
2
3
4
#方式1
df.loc[:,0:2]#可把loc理解为遍历字符串类型,0:2则表示标签为0,1,2三列
#方式2
df.iloc[:,0:3]#iloc遍历的数数字,python中0:3对应0,1,和2
1
2
3
4
df.loc[df['Purchase'] == 'CH', 'Purchase'] = 0
df.loc[df['Purchase'] == 'MM', 'Purchase'] = 1
df['Purchase'] = df['Purchase'].replace({'CH': 0, 'MM': 1})

pd.query

可以指定范围,这样更加方便为机器学习选择数据量

1
data = data.query("x < 2.5 & x > 2 & y < 1.5 & y > 1.0")

时间

  1. 将时间戳转成自己指定的时间格式

    1
    2
    pd.to_datetime(data["time"],unit="s")
    #1970-01-08 05:06:14
  2. 获取年月日,时分秒,周

    1
    2
    3
    4
    5
    6
    7
    8
    先获取时间索引
    date = pd.DatetimeIndex(time_value)

    再获取自己想要的
    date.year
    date.month
    hour
    weekday
1
2
3
data['day'] = pd.to_datetime(data['time']).dt.day
data['weekday'] = pd.to_datetime(data['time']).dt.weekday
data['hour'] = pd.to_datetime(data['time']).dt.hour

agg和apply

agg()函数(Aggregate)用于对数据进行聚合操作,例如计算均值、求和、最大值、最小值等统计指标。它可以应用于DataFrame或Series对象,并接受一个或多个聚合函数作为参数。以下是agg()函数的常见用法:

1
2
3
4
5
6
# 对DataFrame应用聚合函数
df.agg(func)
df.agg({column: func})

# 对Series应用聚合函数
s.agg(func)

其中,df表示DataFrame对象,s表示Series对象,func表示聚合函数,可以是内置函数(如mean()sum()max()min()等),也可以是自定义函数。

使用agg()函数时,可以将多个聚合函数传递给它,并通过列表或字典的方式指定应用每个函数的列。例如,可以使用以下方式计算DataFrame的均值和总和:

1
df.agg(['mean', 'sum'])

还可以通过字典的方式指定每个列应用的聚合函数:

1
2
pythonCopy code
df.agg({'列1': 'mean', '列2': 'sum'})

apply()函数用于对DataFrame或Series的每个元素应用自定义函数,以实现数据的转换、映射或其他操作。它可以应用于DataFrame的整个行或列,或者应用于Series的每个元素。以下是apply()函数的常见用法:

1
2
3
4
5
6
# 对DataFrame的行或列应用函数
df.apply(func, axis=0) # 对列应用函数
df.apply(func, axis=1) # 对行应用函数

# 对Series的每个元素应用函数
s.apply(func)

其中,df表示DataFrame对象,s表示Series对象,func表示自定义函数。

使用apply()函数时,需要传递一个函数作为参数,该函数将应用于每个元素。可以使用lambda表达式定义匿名函数,也可以使用普通函数进行操作。

apply()函数中,通过axis参数可以指定应用函数的方向,axis=0表示按列应用函数,axis=1表示按行应用函数。

需要注意的是,apply()函数在处理大规模数据时可能会较慢,因为它是逐个元素地进行操作。在某些情况下,可以考虑使用向量化操作或其他优化技术来提高性能。

综上所述,agg()函数用于对数据进行聚合操作,而apply()函数用于对每个元素应用自定义函数。它们在数据分析和转换中都有广泛的应用。

表合并

1
data1.merge(data2,how='left', left_on='id', right_on='movie_id')

merge()函数还有其他一些参数可以进行更灵活的合并操作,例如how参数用于指定合并方式(inner、outer、left、right),left_onright_on参数用于指定不同的列名进行连接等。

索引设置

(77条消息) pandas 中读取和写入csv文件时候出现Unnamed:0的解决方案_unnamed: 0_我是天才很好的博客-CSDN博客

1
2
data = data.reset_index(drop=True)
data.index += 1

列重命名

  1. df = df.rename(columns={'旧列名1': '新列名1', '旧列名2': '新列名2'}, inplace=True)
    
    1
    2
    3

    2. ```python
    df.columns = ['新列名1', '新列名2', '新列名3']

保存到csv…

1
df.to_excel('filename.xlsx', index=False)

缺失值处理

  • 查看缺失值:

    1
    2
    data[data['runtime'].isnull()]
    data.isna().sum()
  • REPLACE

    1
    data = data.replace(to_replace="?", value=np.nan)
  • 删除缺失值:

    • 使用dropna()函数删除包含缺失值的行或列。
    • 可以使用df.dropna(axis=0)删除包含缺失值的行,或使用df.dropna(axis=1)删除包含缺失值的列。
    • 注意,删除缺失值可能会导致数据丢失,只在缺失值对分析结果影响较小或可以忽略的情况下使用。
  • 插值:

    • 使用插值方法来根据已知数据点的值推断缺失值。
    • 常见的插值方法包括线性插值、多项式插值、样条插值等。
    • pandas中的interpolate()函数可以根据一定的插值算法填充缺失值。
  • 填充常量值:

    • 使用固定的常量值填充缺失值。

    • 可以使用fillna()函数将缺失值填充为指定的常量值,例如0、-1等。

    • 如果 fillna() 函数的 inplace=True 参数未生效,可能存在以下原因:

      1. 使用了链式索引:在使用链式索引(chained indexing)时,inplace=True 可能不会生效。链式索引是指多次对同一数据进行索引操作,例如使用 data.loc[...],然后再使用 .fillna()。这种操作可能会导致修改无法正确应用到原始数据上。

        解决方法:避免使用链式索引,而是使用单一索引操作,或者使用 .loc 来完成索引和填充操作。

        1
        data.loc[data['id'] == 370980, 'runtime'] = data.loc[data['id'] == 370980, 'runtime'].fillna(98)
    1. 列数据类型不是数值型:如果 runtime 列的数据类型不是数值型(如整数或浮点数),fillna() 函数可能无法正确填充值。

      解决方法:使用 astype() 函数将数据类型转换为数值型。

      1
      2
      pythonCopy codedata['runtime'] = data['runtime'].astype(float)
      data.loc[data['id'] == 370980, 'runtime'].fillna(98, inplace=True)
    2. 数据被赋值给其他变量:在操作中,可能将数据赋值给其他变量,并对其进行修改,而不是直接修改原始数据。

      解决方法:确保对原始数据直接进行操作,而不是对变量进行操作。

      1
      2
      pythonCopy code
      data.loc[data['id'] == 370980, 'runtime'].fillna(98, inplace=True)

    请注意,在填充操作中,要么使用 inplace=True 进行原地修改,要么将结果重新赋值给原始数据。如果以上方法仍然无法解决问题,请提供更多关于数据和操作的详细信息,以便更准确地找到问题的原因和解决方法。

  • 填充统计值:

    • 使用均值、中位数、众数等统计值来填充缺失值。
    • 可以使用fillna()函数将缺失值填充为对应列的均值、中位数、众数等。
  • 使用机器学习算法填充:

    • 使用机器学习算法,如回归模型、K近邻算法等,根据已知的特征值预测缺失值。

explode

(74条消息) pandas100个骚操作五:使用 explode 实现 pandas 列转行的 2 个常用技巧_pandas explode_Python数据科学的博客-CSDN博客

1
film_production = data['production_countries'].str.split('|').explode().value_counts()

1
.get_dummies('|').sum().nlargest(5)

isin及其逆函数

如果想要获取或者删除想要特指的数,可以用isin

其反函数是 ~ 大波浪

1
country_counts_others = country_counts[~country_counts.index.isin(top_countries)]

flatten函数

降维

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
y = director_top10.values.flatten()

原始:
[[28442552025]
[26807330936]
[25930141996]
[23086609676]
[23026826230]
[20078688142]
[19652943043]
[18464690132]
[18343111015]
[17415920425]]

结果:
[28442552025 26807330936 25930141996 23086609676 23026826230 20078688142
19652943043 18464690132 18343111015 17415920425]

删除列

1
2
df.drop(columns = ['B', 'C'], axis=1)
df= df.drop(columns = 'column_name', 1)

get_dummies函数

参考链接:(74条消息) pandas get_dummies用法及代码示例_pandas.get_dummies_独影月下酌酒的博客-CSDN博客

1
就是one hot编码,将文本特征提取
1
data[data['year'].astype(int) >= 1980]['genres'].str.get_dummies('|').sum().nlargest(5)
1
data[data['year'].astype(int) >= 1980].groupby('year')['genres'].apply(lambda x:x.str.get_dummies('|').sum())

最值查找

1
max(),min(),nlargest(),nsmallest()

统计电影风格(genres)数量前五(Top5)的风格随时间(1980年至今)的变化趋势,用折线图的顺滑模式表示,然后x轴为年份,y轴为数量,并且电影风格genres列的格式大致为:Action|Adventure|Fantasy|Science Fiction

cat函数

在series中,做合并通常可以使用cat函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
>>> import pandas as pd
>>> import numpy as np
>>> s = pd.Series(['a', 'b', 'c', 'd'])
>>> s
0 a
1 b
2 c
3 d
dtype: object
>>> s.str.cat(sep=',')
'a,b,c,d'
# 如果中间有nan,不特殊说明,通常直接忽略掉
>>> t = pd.Series(['a', 'b', np.nan, 'd'])
>>> t.str.cat(sep=',')
'a,b,d'
# 通过指定na_rep参数,做连接时,nan被替换
>>> t.str.cat(sep=',', na_rep='-')
'a,b,-,d'

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
30
>>> u = pd.Series(['b', 'd', 'a', 'c'], index=[1, 3, 0, 2])
>>> s
0 a
1 b
2 c
3 d
dtype: object
>>> u
1 b
3 d
0 a
2 c
dtype: object
# 如果不指定join参数,则还是会按照list列表中的
# 顺序依次做连接
>>> s.str.cat(u)
0 ab
1 bd
2 ca
3 dc
dtype: object
# 通过指定连接方式,join有left,right,inner,outer四种
# 连接方式,分别安装index对号连接
>>> s.str.cat(u, join='left')
0 aa
1 bb
2 cc
3 dd
dtype: object

重复值

https://www.jianshu.com/p/23c93e0f369a

1
2
# python中有一个快速删除重复值的函数
data.drop_duplicate()

plt.legend()

plt.legend() 是 matplotlib 库中用于创建图例的函数。图例是一个说明性的标记,用于标识图中不同元素的含义,比如线条、点或其他图形的含义。它通常用于帮助读者理解图中的各个组成部分,并提供关键信息。

plt.legend() 函数用于显示图例,并可以在图中的不同位置放置图例。它有多种用法,下面是一些常见的用法:

  1. 基本用法:

    1
    2
    3
    plt.plot(x, y, label='Line 1')
    plt.plot(x, z, label='Line 2')
    plt.legend()

    在每个 plt.plot() 函数中,使用 label 参数为每条线条添加标签。然后调用 plt.legend() 函数,它会根据标签自动生成图例并将其显示在默认位置。

  2. 自定义图例位置:

    1
    2
    3
    plt.plot(x, y, label='Line 1')
    plt.plot(x, z, label='Line 2')
    plt.legend(loc='upper right')

    plt.legend() 函数中使用 loc 参数可以指定图例的位置。常见的位置参数包括 'upper right''upper left''lower right''lower left''center' 等。

  3. 自定义图例样式:

    1
    2
    3
    plt.plot(x, y, label='Line 1')
    plt.plot(x, z, label='Line 2')
    plt.legend(loc='upper right', fontsize='small', fancybox=True)

    你可以使用其他参数来自定义图例的样式。例如,可以使用 fontsize 参数设置字体大小,使用 fancybox 参数创建一个带有圆角边框的图例框。

请注意,plt.legend() 函数通常在绘制完所有需要显示在图例中的元素后调用,以确保所有标签都被包含在图例中。

plt.figure()

plt.figure() 是 Matplotlib 库中用于创建新图形的函数。它返回一个 Figure 对象,代表了整个图形窗口或画布。

plt.figure() 函数中可以设置一些参数来调整图形的属性,例如:

  • figsize:指定图形的大小,是一个元组,包含宽度和高度的值。例如,figsize=(10, 6) 表示图形宽度为 10,高度为 6。
  • dpi:指定图形的分辨率,即每英寸包含的像素数。默认值为 100。
  • facecolor:指定图形的背景颜色。
  • edgecolor:指定图形的边框颜色。

除了上述属性,plt.figure() 还可以接受其他参数,用于进一步定制图形的外观和行为。例如:

  • num:指定图形的编号,可以用于在多个图形之间进行切换。
  • clear:如果设置为 True,则在创建图形之前清除当前图形窗口中的所有内容。

在创建图形后,可以使用其他 Matplotlib 函数来绘制图形、设置标题、添加标签、调整轴等。最后,使用 plt.show() 函数将图形显示出来。

需要注意的是,plt.figure() 只是创建一个图形对象,并不会自动在图形窗口中显示图形。需要使用其他绘图函数(如 plt.plot()plt.bar() 等)来绘制图形,并通过 plt.show() 来显示图形。

plt.xticks()

plt.xticks() 是 Matplotlib 库中用于设置 x 轴刻度的函数。它可以用于自定义 x 轴上的刻度位置和标签。

plt.xticks() 函数的常用参数包括:

  • ticks:指定 x 轴刻度的位置,可以是一个包含刻度位置的列表或数组。
  • labels:指定 x 轴刻度的标签,可以是一个包含刻度标签的列表或数组。
  • rotation:指定刻度标签的旋转角度,用于调整标签的方向。例如,rotation=90 表示将标签逆时针旋转 90 度。
  • fontsize:指定刻度标签的字体大小。
  • fontweight:指定刻度标签的字体粗细。
  • ha:指定刻度标签的水平对齐方式,可选值包括 'center''right''left',用于调整标签在刻度位置上的对齐方式。

使用 plt.xticks() 可以根据需要灵活地设置 x 轴刻度的位置和标签,以满足不同的绘图需求。例如,可以将刻度位置设置为一组特定的数值,然后将刻度标签设置为对应的文本,或者根据数据动态生成刻度标签等。

需要注意的是,plt.xticks() 只是设置 x 轴刻度的显示方式,并不会自动调整轴的范围。如果需要调整轴的范围,可以使用 plt.xlim() 函数。

最值

除了nlargest函数外,还有以下几个与之类似的函数:

  1. head(n): 返回DataFrame或Series中的前n行(或元素),按索引顺序排列。用法示例:df.head(5)series.head(10)
  2. nsmallest(n, column): 返回DataFrame或Series中指定列(column)最小的n行(或元素),按升序排列。用法示例:df.nsmallest(3, 'column_name')series.nsmallest(5)
  3. tail(n): 返回DataFrame或Series中的后n行(或元素),按索引逆序排列。用法示例:df.tail(5)series.tail(10)
  4. nlargest(n, column): 返回DataFrame或Series中指定列(column)最大的n行(或元素),按降序排列。用法示例:df.nlargest(3, 'column_name')series.nlargest(5)

这些函数可以根据指定的条件或列,返回DataFrame或Series中最大或最小的n个行(或元素),方便进行数据的筛选和排序。

逻辑运算符

在Python中,与&类似的位运算符和逻辑运算符有以下几种:

  1. | (按位或):执行按位或操作,将两个操作数的对应位进行或运算,并返回结果。对于每一位,只要两个操作数的对应位中有一个为1,结果位就为1,否则为0。
  2. ^ (按位异或):执行按位异或操作,将两个操作数的对应位进行异或运算,并返回结果。对于每一位,只有当两个操作数的对应位不相同时,结果位才为1,否则为0。
  3. ~ (按位取反):执行按位取反操作,将操作数的每一位取反,并返回结果。对于每一位,0变为1,1变为0。
  4. && (逻辑与):执行短路逻辑与操作,当左侧的表达式为True时,才会计算并返回右侧的表达式的值;否则,直接返回False。
  5. || (逻辑或):执行短路逻辑或操作,当左侧的表达式为False时,才会计算并返回右侧的表达式的值;否则,直接返回True。
  6. 作为逻辑运算符,&执行逻辑与操作。它将两个布尔表达式进行与运算,并返回结果。只有当两个表达式都为True时,结果为True;否则,结果为False。

groupby函数

在 Pandas 中,groupby() 方法之后可以使用多种方法对分组后的数据进行操作和计算。一些常用的方法包括:

  • 聚合函数:例如 sum()mean()count()max()min() 等,用于对分组后的数据进行统计计算。
  • 过滤函数:例如 filter(),用于基于某些条件筛选分组。
  • 变换函数:例如 transform(),用于对每个分组应用转换操作并返回与原始数据相同形状的新数据。
  • 应用函数:例如 apply(),允许自定义函数应用于每个分组。

除了上述方法,还可以使用 agg() 方法对不同的列应用不同的聚合函数,使用 size() 方法计算每个分组的大小,使用 first()last() 方法获取每个分组的第一个或最后一个值等。

透视表

在 Python 中,可以使用 Pandas 库的 pivot_table() 函数来创建透视表。透视表是一种数据汇总和分析的工具,它可以根据给定的行和列索引对数据进行聚合和统计。

pivot_table() 函数的基本语法如下:

1
pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None)

其中,参数的含义如下:

  • data:要进行透视的原始数据集,通常是一个 DataFrame。
  • values:要聚合的数值列,可以是单个列名或包含多个列名的列表。
  • index:透视表的行索引,可以是单个列名或包含多个列名的列表。
  • columns:透视表的列索引,可以是单个列名或包含多个列名的列表。
  • aggfunc:聚合函数,用于指定对数值列进行聚合的方法,默认为 'mean'(平均值)。其他常用的聚合函数包括 'sum'(求和)、'count'(计数)、'max'(最大值)、'min'(最小值)等。
  • fill_value:用于填充缺失值的默认值。

通过指定 indexcolumnsvalues,可以根据这些列进行分组和聚合,生成透视表。聚合函数会对指定的数值列进行计算,最终生成汇总的结果。

顺滑模式

1
scipy.interpolate.make_interp_spline``scipy.interpolate`是SciPy 库中模块的函数。它用于三次样条插值,这是一种用平滑曲线对数据点进行插值的方法。在代码中使用此函数的目的是根据相应的 x 值 ( )为五个不同数据集 ( `y1`、`y2`、`y3`、`y4`和) 生成平滑曲线(样条线) 。`y5``x

让我们一步步分解代码:

  1. x_smooth = np.linspace(int(x.min()), int(x.max()), 400):此行创建一个新数组x_smooth,其中包含原始 x 值 ( ) 的最小值和最大值之间的 400 个均匀间隔的点x。NumPy 中的函数linspace用于此目的。
  2. y_smooth1 = make_interp_spline(x, y1)(x_smooth):该行使用该函数为数据集make_interp_spline创建样条插值y1``x。结果是y_smooth1在新的 x 值(``x_smooth)。该make_interp_spline`函数返回一个可调用函数,可用于评估
  3. 同样,接下来的四行 ( y_smooth2, y_smooth3, yy_smooth4, y_smooth5) 对数据集执行相同的样条插值``y2, y3, y4, 和y5,分别评估样条线x_smooth