如何使用布尔掩码在pandas DataFrame中用nan替换'any strings'?

Mal*_*oné 13 python numpy dataframe python-3.x pandas

我有一个227x4 DataFrame,国家名称和数值要清理(争吵?).

这是DataFrame的抽象:

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
Run Code Online (Sandbox Code Playgroud)

如何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
Run Code Online (Sandbox Code Playgroud)

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

Max*_*axU 8

cols = ['Measure1','Measure2']
df[cols] = df[cols].applymap(lambda x: x if not isinstance(x, str) else np.nan)
Run Code Online (Sandbox Code Playgroud)

要么

df[cols] = df[cols].applymap(lambda x: np.nan if isinstance(x, str) else x)
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)


Flo*_*oor 6

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

cols = ['Measure1','Measure2']
df[cols] = df[cols].apply(pd.to_numeric,errors='coerce')
Run Code Online (Sandbox Code Playgroud)
 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

  • 我认为在这种情况下我们可以摆脱`lambda`:`df [cols] = df [cols] .apply(pd.to_numeric,errors ='corece')` (2认同)

jez*_*ael 5

仅分配感兴趣的列:

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
Run Code Online (Sandbox Code Playgroud)

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

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