python - 将 pandas 过滤器应用于数据帧会得到一个充满 NaN 的数据帧

标签 python python-3.x pandas

我不明白为什么会发生这种情况。我正在尝试将 pandas 过滤器应用于由 29k 行和 64 列组成的更大的 df。然而,我已经成功地在玩具 df 上重现了相同的错误,我将在此处用于解释目的。

假设您有以下 df:

df = pd.DataFrame({'contr': [1,2,3,4,5], 'type': [1356, 89, 134, 79, 117], 'total': [582747.2, 267492.4, 264894.6, -12727438.3, 7362748.6]})



contr   type    total   
    1   1356    582747.2    
    2     89    267492.4    
    3    134    264894.6    
    4     79   -127438.3    
    5    117    7362748.6   

然后使用标准缩放器对其进行缩放:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
df_scaled = pd.DataFrame(df_scaled, columns = [df.columns])

现在让我们添加一列来进行过滤:

labels = [1,2,3,4,5]
df_scaled['labels'] = labels

如果我应用这些过滤器:

labels1 = df_scaled[df_scaled['labels'] == 1]
labels2 = df_scaled[df_scaled['labels'] == 2]
labels3 = df_scaled[df_scaled['labels'] == 3]
labels4 = df_scaled[df_scaled['labels'] == 4]

这就是我得到的:

labels1

Out[1]:     

contr   type    total   labels
  NaN    NaN      NaN      1.0
  NaN    NaN      NaN      NaN
  NaN    NaN      NaN      NaN
  NaN    NaN      NaN      NaN
  NaN    NaN      NaN      NaN

如果我对原始 df 应用相同的过滤器:

labels1 = df[df['labels'] == 1]
labels2 = df[df['labels'] == 2]
labels3 = df[df['labels'] == 3]
labels4 = df[df['labels'] == 4]

结果看起来符合预期:

标签1

输出[2]:

contr   type    total   labels
    1   1356 582747.2    1

labels2

Out [3]: 

contr   type    total   labels
    2     89 267492.4        2

其余过滤器依此类推。

我只是不明白为什么会发生这种奇怪的行为,但是当应用于缩放的数据帧时,pandas 过滤似乎失败了。

有谁知道为什么会发生这种情况以及如何避免它?我完全迷失在这里。

提前非常感谢您。

最佳答案

这将解决您的问题:

labels1 = df_scaled[(df_scaled['labels'] == 1).values]
labels2 = df_scaled[(df_scaled['labels'] == 2).values]
labels3 = df_scaled[(df_scaled['labels'] == 3).values]
labels4 = df_scaled[(df_scaled['labels'] == 4).values]

由于某种原因(我不知道为什么)您正在应用的过滤器没有转换为系列。

编辑1:

这样做的原因是因为标签列是一个多索引而不是数据帧的简单列。您可以通过创建df_scaled.columns来查看这一点。

如果您更改列名称df_scaled.columns = ['contr', 'total', 'type', 'labels'],则 df_scaled[df_scaled['labels' ] == 1] 会起作用。

编辑2:

如果你改变线路:

 df_scaled = pd.DataFrame(df_scaled, columns = [df.columns])

 df_scaled = pd.DataFrame(df_scaled, columns = df.columns)

你的问题已经解决了。

关于python - 将 pandas 过滤器应用于数据帧会得到一个充满 NaN 的数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54107529/

相关文章:

python - 如何将 django QueryDict 更改为 Python Dict?

python - 使用 .apply(pd.Timestamp) 时如何指定日期标准。 Python 混淆 11/12/2018 的日期和月份

python pandas dataframe将所有元素突变为(行中的元素/最大元素)

python - 在 SQLAlchemy 中调用 delete() 后行仍然存在

python - Pandas 合并101

python - 使用生成器逐行读取 json

python - 如何在 Python 中导入子模块? (没有 `exec` )

python - 如何使用ezdxf关闭属性打印设置?

python - 使用 pandas 和 numpy 获取差异并消除间隙时间序列数据

python - pandas:如何通过选择列范围来过滤行?