基于条件替换Pandas数据框中的值

4
我有一个数据框列,其中包含一些数字值。我希望根据给定的条件将这些值替换为1和0。条件是,如果该值高于该列的平均值,则将数值更改为1,否则将其设置为0。
以下是我现在拥有的代码:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

dataset = pd.read_csv('data.csv')
dataset = dataset.dropna(axis=0, how='any')

X = dataset.drop(['myCol'], axis=1)
y = dataset.iloc[:, 4:5].values

mean_y = np.mean(dataset.myCol)

目标是数据框 y。y 的格式如下:
      0
0    16
1    13
2    12.5
3    12

等等,第一句话中的“and so on”是什么意思?如果您能告诉我更多上下文,那么我就可以更好地为您翻译。

mean_y等于3.55。因此,我需要所有大于3.55的值变成1,其余为0。

我尝试了以下循环,但没有成功:

for i in dataset.myCol:
    if dataset.myCol[i] > mean_y:
        dataset.myCol[i] = 1
    else:
        dataset.myCol[i] = 0

输出结果如下:
      0
0    16
1    13
2    0
3    12

我做错了什么?有人能解释一下我的错误吗?
谢谢!
2个回答

6
尝试这种矢量化的方法:
dataset.myCol = np.where(dataset.myCol > dataset.myCol.mean(), 1, 0)

这个方法很有效!谢谢。你能告诉我为什么我的方法不起作用吗? - AndrewDAG
你正在使用值而不是索引来索引你的 dataset.myCol 系列。i - 包含值,而 dataset.myCol[i] 需要索引。注意:在 Pandas 中,循环应该作为“最后的手段”使用,当没有其他办法时。 - MaxU - stand with Ukraine
1
谢谢,Max。现在明白了 :) - AndrewDAG

2

将布尔掩码转换为整数 - 将True转换为1,将False转换为0:

print (dataset.myCol > mean_y)
0     True
1    False
2    False
3    False
Name: myCol, dtype: bool

dataset.myCol = (dataset.myCol > mean_y).astype(int)
print (dataset)
   myCol
0      1
1      0
2      0
3      0

对于您的方法,不建议使用,因为它速度较慢。推荐使用iterrows通过列和索引值设置值:

for i, x in dataset.iterrows():
    if dataset.loc[i, 'myCol'] > mean_y:
        dataset.loc[i, 'myCol'] = 1
    else:
        dataset.loc[i, 'myCol'] = 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接