📜  如果丢失数据过多,pandas df 修剪列 - Python (1)

📅  最后修改于: 2023-12-03 15:09:18.944000             🧑  作者: Mango

如果丢失数据过多,Pandas DataFrame 修剪列 - Python

在处理数据时,经常会遇到有些列缺失了太多数据,这些列对我们的分析和预测并没有太大的帮助。我们可以采取一些方法来修剪这些列,让我们更专注于那些关键列。

方法一:使用 dropna 函数

可以使用 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% 的非空值的列才会被保留。

方法二:使用 corr 函数

可以使用 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 的列将被删除。

方法三:使用 PCA 函数

可以使用 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 填充了其中的缺失值。