替换列(字符串)中的值时无法覆盖现有的数据框值

邦佐贡多

我在熊猫中有一个带有客户ID及其性别的数据框。但是,在清理数据集时,我注意到某些ID被分配了两个性别,在大多数情况下,它是Female或Male和Unknown。

df看起来像这样:

 index   ID    gender
   0     23      M
   1     23      U
   2     55      F
   3     55      U

我的目标是找到分配了两种性别的ID,并将U性别替换为非U性别。

为此,我在列表上使用了for循环,在该列表中,我具有所有性别不一致的客户ID。例如,对于ID = 23,循环内的代码如下所示:

if all((customers.loc[customers['ID'] == 23]['gender'].str.contains('M')) | (customers.loc[customers['ID'] == 23]['gender'].str.contains('U'))):
    customers.loc[customers['ID'] == 23]['gender'] = customers.loc[customers['ID'] == 23]['gender'].replace('U', 'M')

我的问题:

  1. 不知道for循环和if语句是否最适合执行我的任务
  2. 使用我的方法时,我无法覆盖现有数据框。我尝试使用replace(inplace = True),我尝试使用.loc()如上所述分配新性别,但也尝试使用链式索引。在所有情况下,我都会收到警告(使用.loc或链接索引时):

    A value is trying to be set on a copy of a slice from a DataFrame.
    Try using .loc[row_indexer,col_indexer] = value instead
    See the caveats in the documentation: http://pandas.pydata.org/pandas- 
    docs/stable/indexing.html#indexing-view-versus-copy
    

(在使用replace(inplace = True时)

    C:\Users\***: SettingWithCopyWarning: 
    A value is trying to be set on a copy of a slice from a DataFrame

并且原始数据帧是完整的。

我对StackOverflow进行了广泛的研究,但仍然无法解决问题。

pp

循环对于此任务将效率低下。相反,您可以使用groupby这是一种依赖于排序的解决方案。

请注意,升序NaN显示在M下方F

res = df.copy()

res['gender'] = res.replace('U', np.nan\
                   .sort_values('gender')\
                   .groupby('ID')['gender'].transform('first')\
                   .fillna('U')\
                   .sort_values('index')

print(res)

   index  ID gender
0      0  23      M
1      1  23      M
2      2  55      F
3      3  55      F

在这种特定情况下,如@ pshep123所述,由于U按字母顺序出现在后面M,因此F您可以采用分组最小值:

res['gender'] = res.groupby('ID')['gender'].transform('min')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果所有值都是特定字符串,则删除pandas数据框中的列

如何在json文件中插值现有的php字符串文字?

用字符串值替换数据框中的NaN

Python替换数据框字符串而非子字符串中的整个值

根据数据框“字典”用数字值替换字符串的有效方法

当列表值与Pyspark数据框中的列值的子字符串匹配时,填充新列

替换字符串列中的数据框值,以获取要从另一列替换的值

替换所有在熊猫数据框中不包含特定字符串的值

如何在字符串中查找特定的关键字并将其替换为现有的字符串值?

如何将数据框的列值替换为与输入值匹配的空字符串?

在数据框中添加带有字符串值的列

熊猫数据框列:用数字替换字符串值时出错

替换与数据框中的某些字符串匹配的值

匹配数据框中所有列的字符串,并估算或替换值

将行值转换为Pandas数据框中现有的预定义列

替换现有的列名称,同时将带有空字符串的新列添加到pandas数据框

当部分字符串匹配时,如何基于字典替换整个数据框中的值?

将列的值提取到字符串中并替换数据框列中的值

删除缺少值的数据框列中的字符串之后的所有内容

如何在ruby中将字符串值附加到现有的列值?

替换字符串中的字母组合,该字符串是pandas数据框中的列值

如何根据 Python 数据框中现有的值向新列添加值?

如何在 PySpark 中用 NULL 替换数据框中所有列的字符串值?

Pandas :在添加新行时,它会替换我现有的数据框值吗?

如何在 Python 数据框中添加具有字典字符串值的列

如何根据具有字符串值的列从数据框中删除重复项

如何从java中现有的特定JButton变量中检索字符串值调用?

需要将所有值替换为 ABC,其中 ABC 是数据框中的子字符串

如何在列表中获取数据框名称的子字符串以用此字符串替换列中的所有值?