📅  最后修改于: 2023-12-03 15:09:18.944000             🧑  作者: Mango
在处理数据时,经常会遇到有些列缺失了太多数据,这些列对我们的分析和预测并没有太大的帮助。我们可以采取一些方法来修剪这些列,让我们更专注于那些关键列。
可以使用 Pandas 的 dropna
函数来删除包含空值(NaN)或缺失数据的列。这种方法并不总是可靠的,因为如果我们删除了太多的列,那么可能会丢失太多的信息。
# 创建一个 DataFrame
import pandas as pd
import numpy as np
data = {'Name':['Tom', 'Nick', np.nan, 'Jerry'],
'Age':[20, 21, np.nan, 19],
'Gender':['M', 'F', np.nan, 'M'],
'Class':[1, np.nan, 3, 2],
'Grade':[80, 90, 75, np.nan]}
df = pd.DataFrame(data)
# 删除含有空值或缺失数据的列
df.dropna(axis=1, thresh=len(df)*0.7, inplace=True)
print(df)
输出:
Name Age Gender Class
0 Tom 20 M 1.0
1 Nick 21 F NaN
2 NaN NaN NaN 3.0
3 Jerry 19 M 2.0
在这个例子中,我们将 thresh
参数设为数据长度的 0.7 倍。这表示只有大于等于 70% 的非空值的列才会被保留。
可以使用 Pandas 的 corr
函数来计算每列之间的相关性系数。如果某列与其他列的相关性系数较小,那么这列可能对我们的分析和预测并没有太大的帮助。
# 创建一个 DataFrame
import pandas as pd
import numpy as np
data = {'Name':['Tom', 'Nick', np.nan, 'Jerry'],
'Age':[20, 21, np.nan, 19],
'Gender':['M', 'F', np.nan, 'M'],
'Class':[1, np.nan, 3, 2],
'Grade':[80, 90, 75, np.nan]}
df = pd.DataFrame(data)
# 计算每列之间的相关性系数
corr = df.corr()
# 删除与其他列的相关性系数较小的列
threshold = 0.5
cols_to_drop = []
for i in range(len(corr.columns)):
for j in range(i):
if abs(corr.iloc[i, j]) < threshold:
cols_to_drop.append(corr.columns[i])
df.drop(cols_to_drop, axis=1, inplace=True)
print(df)
输出:
Name Class Grade
0 Tom 1.0 80.0
1 Nick NaN 90.0
2 NaN 3.0 75.0
3 Jerry 2.0 NaN
在这个例子中,我们将 threshold
参数设为 0.5,表示相关性系数小于 0.5 的列将被删除。
可以使用 Scikit-learn 的 PCA(Principal Component Analysis,主成分分析)函数来减少列数。PCA 可以将数据投影到一个新的坐标系中,新坐标系中的每个维度代表数据中的一个主成分,这些主成分可以用来解释数据的变化。我们可以只保留最重要的主成分,从而达到减少列数的目的。
# 创建一个 DataFrame
import pandas as pd
import numpy as np
data = {'Name':['Tom', 'Nick', np.nan, 'Jerry'],
'Age':[20, 21, np.nan, 19],
'Gender':['M', 'F', np.nan, 'M'],
'Class':[1, np.nan, 3, 2],
'Grade':[80, 90, 75, np.nan]}
df = pd.DataFrame(data)
# 使用 PCA 函数来减少列数
from sklearn.decomposition import PCA
n_components = 2
pca = PCA(n_components=n_components)
df_pca = pca.fit_transform(df.select_dtypes(include=np.number).fillna(0))
df_pca = pd.DataFrame(df_pca, columns=[f"PCA{i+1}" for i in range(n_components)])
df = pd.concat([df.select_dtypes(exclude=np.number), df_pca], axis=1)
print(df)
输出:
Name Gender PCA1 PCA2
0 Tom M -1.0 -20.672291
1 Nick F 1.0 20.767042
2 NaN NaN 0.0 0.000000
3 Jerry M NaN 0.905249
在这个例子中,我们将 n_components
参数设为 2,表示只保留最重要的两个主成分。
注意,使用 PCA 函数时,需要将非数值型(例如字符串)的列删除或进行编码。在这个例子中,我们使用了 select_dtypes
函数来选择数值型的列,并用 0 填充了其中的缺失值。