当前位置: 首页 > 知识库问答 >
问题:

如何使用布尔掩码将pandas数据帧中的“任意字符串”替换为nan?

明星剑
2023-03-14

我有一个227x4的数据帧与国家名称和数值清洁(wrangle?)。

以下是数据帧的抽象:

import pandas as pd
import random
import string
import numpy as np
pdn = pd.DataFrame(["".join([random.choice(string.ascii_letters) for i in range(3)]) for j in range (6)], columns =['Country Name'])
measures = pd.DataFrame(np.random.random_integers(10,size=(6,2)), columns=['Measure1','Measure2'])
df = pdn.merge(measures, how= 'inner', left_index=True, right_index =True)

df.iloc[4,1] = 'str'
df.iloc[1,2] = 'stuff'
print(df)

  Country Name Measure1 Measure2
0          tua        6        3
1          MDK        3    stuff
2          RJU        7        2
3          WyB        7        8
4          Nnr      str        3
5          rVN        7        4

如何将所有列中的字符串值替换为np.nan,而不涉及国家名称?

我尝试使用布尔掩码:

mask = df.loc[:,measures.columns].applymap(lambda x: isinstance(x, (int, float))).values
print(mask)

[[ True  True]
 [ True False]
 [ True  True]
 [ True  True]
 [False  True]
 [ True  True]]

# I thought the following would replace by default false with np.nan in place, but it didn't
df.loc[:,measures.columns].where(mask, inplace=True)
print(df)

  Country Name Measure1 Measure2
0          tua        6        3
1          MDK        3    stuff
2          RJU        7        2
3          WyB        7        8
4          Nnr      str        3
5          rVN        7        4


# this give a good output, unfortunately it's missing the country names
print(df.loc[:,measures.columns].where(mask))

  Measure1 Measure2
0        6        3
1        3      NaN
2        7        2
3        7        8
4      NaN        3
5        7        4

我看了几个与我有关的问题([1]、[2]、[3]、[4]、[5]、[6]、[7]、[8]),但找不到一个回答我所关心的问题。

共有3个答案

薄伟彦
2023-03-14

使用带有错误的数字强制,即

cols = ['Measure1','Measure2']
df[cols] = df[cols].apply(pd.to_numeric,errors='coerce')
 Country Name  Measure1  Measure2
0          PuB       7.0       6.0
1          JHq       2.0       NaN
2          opE       4.0       3.0
3          pxl       3.0       6.0
4          ouP       NaN       4.0
5          qZR       4.0       6.0
湛铭
2023-03-14
cols = ['Measure1','Measure2']
df[cols] = df[cols].applymap(lambda x: x if not isinstance(x, str) else np.nan)

df[cols] = df[cols].applymap(lambda x: np.nan if isinstance(x, str) else x)

结果:

In [22]: df
Out[22]:
  Country Name  Measure1  Measure2
0          nBl      10.0       9.0
1          Ayp       8.0       NaN
2          diz       4.0       1.0
3          aad       7.0       3.0
4          JYI       NaN      10.0
5          BJO       9.0       8.0
任文乐
2023-03-14

仅指定感兴趣的列:

cols = ['Measure1','Measure2']
mask = df[cols].applymap(lambda x: isinstance(x, (int, float)))

df[cols] = df[cols].where(mask)
print (df)
  Country Name Measure1 Measure2
0          uFv        7        8
1          vCr        5      NaN
2          qPp        2        6
3          QIC       10       10
4          Suy      NaN        8
5          eFS        6        4

一个元问题,我在这里花3个多小时来制定一个问题(包括研究)是正常的吗?

在我看来,是的,创造好的问题真的很难。

 类似资料:
  • 问题内容: 我有一个布尔变量,我想将其转换为字符串: 我需要转换后的值的格式为:,而不是 我试过了: 但是它告诉我,并且不是公认的功能。 如何将此布尔值转换为PHP 或PHP 格式的字符串? 问题答案: 最简单的解决方案:

  • 问题内容: 如何将字符串转换为? 它返回 布尔值true 但这应该是。 问题答案: 除非字符串的值被PHP视为“空”(从的文档中获取),否则字符串始终为布尔值true : (一个空字符串); (0作为字符串) 如果您需要根据字符串的文本值设置布尔值,则需要检查该值是否存在。 编辑:上面的代码旨在使理解更加清晰。在实际使用中,以下代码可能更合适: 或者使用该功能可能会覆盖更多的布尔值: 覆盖整个范围

  • 问题内容: 我想将它们分成几个新列。假设我有一个看起来像这样的数据框: 我知道使用: 我可以分割一个字符串。但是,下一步,我想像这样有效地将拆分后的字符串放入新列中: 我可以例如这样做: 但是,如何才能更优雅地达到相同的结果呢? 问题答案: 该方法有一个参数: 带有列名: Python> = 3.6 f字符串的情况更加整洁:

  • 问题内容: 无论如何,有没有使用映射功能或更好的方法来替换整个数据框中的值? 我只知道如何在系列上执行映射。 我想用数字替换“ tesst”和“ set”列中的字符串,例如set = 1,test = 2 这是我的数据集的一个示例:(原始数据集非常大) 最终结果应该是 感谢您的指教, 问题答案: 那呢 正如@Jeff在评论中指出的那样,在熊猫版本<0.11.1中,手动添加到末尾以正确转换tesst

  • 本文向大家介绍如何将R数据帧中的字符串转换为NA?,包括了如何将R数据帧中的字符串转换为NA?的使用技巧和注意事项,需要的朋友参考一下 我们经常会在数据收集过程中发现错误,这些错误可能会导致研究结果不正确。当错误地收集数据时,将使分析师的工作变得困难。显示数据有错误的一种情况是获取字符串代替数字值。因此,我们需要将这些字符串转换为R中的NA,以便我们可以进行预期的分析。 示例 请看以下数据帧- 将