我不明白为什么会发生这种情况。我正在尝试将 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/