IIUCあなたはastype
によってstring
に値を変換してboolean mask
を作成し、-
と比較することができます。コメントで
mask = df_1.astype(str) == '-'
print (mask)
A B C
0 False False False
1 True False False
2 False False True
print (df_1.mask(mask, df_2))
A B C
0 x 1 2
1 y 6 1
2 z 9 8
print (df_1.where(~mask, df_2))
A B C
0 x 1 2
1 y 6 1
2 z 9 8
EDIT:最終mask
~
によってを反転してmask
またはwhere
別DataFrame
から-
に値を埋める
一つの可能な解決策は、su79eu7kである、あなたに感謝:
masks = [('A', r'[a-zA-Z]'), ('B', r'\d'), ('C', r'\d')];
print pd.concat([~(df_1[col].astype(str).str.contains(regex)) for col, regex in masks], axis=1)
別の解決方法を作成mask
- 最初fillna
可能NaN
の値がある場合、replace
の値がdict
からNaN
までであり、最後にisnull
という値が見つかりませんでした。
import pandas as pd
import numpy as np
df_1 = pd.DataFrame({'A': ['-x', '-', np.nan],'B': [1, 6, 'Unknown'],'C': [2, 1, 'Missing']})
print (df_1)
df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]})
print (df_2)
mask_li = ['-','Unknown','Missing']
d = {x:np.nan for x in mask_li}
mask = df_1.fillna(1).replace(d).isnull()
print (mask)
A B C
0 False False False
1 True False False
2 False True True
print (df_1.mask(mask, df_2))
A B C
0 -x 1 2
1 y 6 1
2 NaN 9 8
あなたはstr.contains
を使用することができますが、他のデータがリストmask_li
から値を含めることはできません。
mask_li = ['-','Unknown','Missing']
mask= df_1.copy()
for col in df_1.columns:
mask[col] = mask[col].astype(str).str.contains('|'.join(mask_li))
print (mask)
A B C
0 False False False
1 True False False
2 False True True
print (df_1.mask(mask, df_2))
A B C
0 x 1 2
1 y 6 1
2 z 9 8
しかし、別のデータがmask_li
例えばからの値が含まれている場合、問題がある可能性があります-
:
例えば:
import pandas as pd
import numpy as np
df_1 = pd.DataFrame({'A': ['-x', '-', '-z'], 'B': [1, 6, 'Unknown'], 'C': [2, 1, 'Missing']})
print (df_1)
df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]})
print (df_2)
mask_li = ['-','Unknown','Missing']
mask= df_1.copy()
for col in df_1.columns:
mask[col] = mask[col].astype(str).str.contains('|'.join(mask_li))
print (mask)
A B C
0 True False False
1 True False False
2 True True True
print (df_1.mask(mask, df_2))
A B C
0 w 1 2
1 y 6 1
2 y 9 8
一つの可能な解決策:
import pandas as pd
import numpy as np
df_1 = pd.DataFrame({'A': ['-x', '-', '-z'], 'B': [1, 6, 'Unknown'], 'C': [2, 1, 'Missing']})
print (df_1)
df_2 = pd.DataFrame({'A': ['w', 'y', 'y'], 'B': [5, 6, 9], 'C': [2, 1, 8]})
print (df_2)
mask_li = ['Unknown','Missing']
mask= df_1.copy()
for col in df_1.columns:
column = mask[col].astype(str)
mask[col] = (column.str.contains('|'.join(mask_li))) | (column == '-')
print (mask)
A B C
0 False False False
1 True False False
2 False True True
print (df_1.mask(mask, df_2))
A B C
0 -x 1 2
1 y 6 1
2 -z 9 8
ご期待手順としてくださいつながります? – su79eu7k
ありがとう、私はそれを追加していないことに気付かなかった –