【问题标题】:Replace value in Pandas Dataframe based on condition根据条件替换 Pandas Dataframe 中的值
【发布时间】:2018-09-26 04:51:45
【问题描述】:

我有一个包含一些数值的数据框列。我希望根据给定条件将这些值替换为 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

等等。 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

我做错了什么?有人可以解释一下这个错误吗?

谢谢!

【问题讨论】:

    标签: python pandas dataframe replace conditional-statements


    【解决方案1】:

    试试这种矢量化方法:

    dataset.myCol = np.where(dataset.myCol > dataset.myCol.mean(), 1, 0)
    

    【讨论】:

    • 效果很好!谢谢。你能告诉我为什么我的方法不起作用吗?
    • 您正在通过值而不是索引来索引您的dataset.myCol 系列。 i - 将包含值,dataset.myCol[i] 需要索引。注意:循环应该被用作最后的手段,当在 Pandas 中没有其他帮助时
    • 谢谢你,马克斯。现在明白了:)
    【解决方案2】:

    将布尔掩码转换为整数 - Trues 转换为 1Falses 转换为 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
    

    【讨论】:

      猜你喜欢
      • 2015-10-09
      • 2020-06-22
      • 2018-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      相关资源
      最近更新 更多