国名と数値を含む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
国名を変更せずにすべての列で文字列値を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] )、ただし私の懸念に答える人を見つけることができませんでした。
関心のある列のみを割り当てます。
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時間以上かかるのは普通ですか(研究を含む)?
私の意見では、はい、良い質問を作成することは本当に難しいです。
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
エラーを伴う数値、つまり強制
cols = ['Measure1','Measure2']
df[cols] = df[cols].apply(pd.to_numeric,errors='coerce')
国名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