【问题标题】:DataFrame column value not updated by 'replace'“替换”未更新 DataFrame 列值
【发布时间】:2024-01-24 00:01:01
【问题描述】:

我有一个包含以下记录的数据集:


@attribute pelvic_incidence numeric
@attribute pelvic_tilt numeric
@attribute lumbar_lordosis_angle numeric
@attribute sacral_slope numeric
@attribute pelvic_radius numeric
@attribute degree_spondylolisthesis numeric

@data
74.09473084,18.82372712,76.03215571,55.27100372,128.4057314,73.38821617,Abnormal
87.67908663,20.36561331,93.82241589,67.31347333,120.9448288,76.73062904,Abnormal
48.25991962,16.41746236,36.32913708,31.84245726,94.88233607,28.34379914,Abnormal
38.50527283,16.96429691,35.11281407,21.54097592,127.6328747,7.986683227,Normal
54.92085752,18.96842952,51.60145541,35.952428,125.8466462,2.001642472,Normal
44.36249017,8.945434892,46.90209626,35.41705528,129.220682,4.994195288,Normal
48.3189305,17.45212105,47.99999999,30.86680945,128.9803079,-0.910940567,Normal

我希望从给定的数据集创建一个“DataFrame”,然后将名为“类”的列的标签分别从“异常”更改为 0,将“正常”更改为 1。我做了以下事情:

raw_data = loadarff('column_2C_weka.arff')
df = pd.DataFrame(raw_data[0])
df["class"].replace({"Abnormal": "0" , "Normal" : "1"},inplace = True)
print(df['class'])

不幸的是,“类”列没有更新值,即它仍然显示相同的“异常”和“正常”数据标签。

为了更确定 replace 方法的工作原理,我尝试了一个小的 DataFrame:

df = pd.DataFrame({"column1": ["a", "b", "a"]})
print(df)
df["column1"].replace({"a": "x", "b": "y"}, inplace=True)
print(df)

令人惊讶的是,它确实将值从 a 更改为 x 并将 b 更改为 y:

column1
0       a
1       b
2       a
  column1
0       x
1       y
2       x

我很困惑。为什么我的数据集没有出现,而是被这个 DataFrame 替换了?

提前致谢。

P。 S : 这样的事情对我有用

df['class'] = df['class'].astype(str).str.replace('Abnormal', '0')

我不知道它是如何获得所需输出的,而不是之前的所有输出!任何帮助表示赞赏。

【问题讨论】:

  • 对于您的样本,loadarff 未加载您的最后一列。你使用来自scipyloadarff 吗?
  • 解释在this答案中。
  • @Corralien 是的,我写了from scipy.io.arff import loadarff。但是为什么没有加载最后一列?
  • @jezrael 我删除了 inplace = True 部分,还尝试完全删除 inplace 方法,但仍然得到相同的输出。
  • 如果你想替换inplace,你不应该切片你的数据框:df.replace({'class': {'Abnormal': '0' , 'Normal' : '1'}}, inplace=True)

标签: python pandas dataframe replace


【解决方案1】:

看来你的列是字节而不是str,所以使用

df['class'] = df['class'].str.decode('utf-8').replace({'Abnormal': 0, 'Normal': 1})
print(df)

# Output
   pelvic_incidence  pelvic_tilt  lumbar_lordosis_angle  sacral_slope  pelvic_radius  degree_spondylolisthesis class
0         74.094731    18.823727              76.032156     55.271004     128.405731                 73.388216     0
1         87.679087    20.365613              93.822416     67.313473     120.944829                 76.730629     0
2         48.259920    16.417462              36.329137     31.842457      94.882336                 28.343799     0
3         38.505273    16.964297              35.112814     21.540976     127.632875                  7.986683     1
4         54.920858    18.968430              51.601455     35.952428     125.846646                  2.001642     1
5         44.362490     8.945435              46.902096     35.417055     129.220682                  4.994195     1
6         48.318931    17.452121              48.000000     30.866809     128.980308                 -0.910941     1

【讨论】:

  • @QUEEN。现在解决你的问题了吗?
  • 我试过了,但它说ValueError: Columns must be same length as key 实际上像df['class'] = df['class'].astype(str).str.replace('Abnormal', '0') 这样的东西对我有用,但我不知道为什么。我正在相应地编辑我的问题。
  • 您可以共享您的数据吗?
  • 非常感谢。终于df['class'] = df['class'].str.decode('utf-8').replace({'Abnormal': 0, 'Normal': 1}) 工作了!知道为什么这会成功吗?
  • 当您使用loadarff 加载文件时,似乎文本字段被转换为字节,因为文件可能以二进制模式打开。