2016-05-08 6 views
1

this questionへの完全で正確な応答に基づいて、私はわずかに異なるデータに基づいて新しい問題に直面しています。変更次いで他の列パート2の値に基づく値からのパンダのマルチインデックス減算

df = pd.DataFrame({ 
    ('A', 'a'): [23,3,54,7,32,76], 
    ('B', 'b'): [23,'n/a',54,7,32,76], 
    ('possible','possible'):[100,100,100,100,100,100] 
    }) 
df 
    A  B possible 
    a  b possible 
0 23  23  100 
1 3  n/a  100 
2 54  54  100 
3 7  n/a  100 
4 32  32  100 
5 76  76  100 

Iの値が「N/A」は、その行の任意のインスタンス(カラム)のために、行ごとに、「可能」から4を減算したい(と: は、このデータフレームを与えられますすべての 'n/a'値を0にする)。

A  B possible 
    a  b possible 
0 23  23  100 
1 3  n/a  96 
2 54  54  100 
3 7  n/a  96 
4 32  32  100 
5 76  76  100 

いくつかの条件: (彼らは検査の際に、整数のように見えるが)列は、すべての浮動小数点数であることを発生することがあります。これは最初の質問には含まれていませんでした。

「n/a」値の2つのインスタンス(列)が行に含まれることもあります。これは以前の解決策によって解決されました。

idx = pd.IndexSlice 
df.loc[:, idx['possible', 'possible']] -= (df.loc[:, idx[('A','B'),:]] == 'n/a').sum(axis=1) * 4 
df.replace({'n/a':0}, inplace=True) 

これはカラム(AまたはB)は、すべての浮動小数点数(一見整数)を含有する場合を除いて、動作:

ここ以前のソリューションです。それが事実だときに、このエラーが発生します。

TypeError: Could not compare ['n/a'] with block values 

答えて

1

を私はあなたが条件にastypeによってstringにキャストを追加することができると思います。

idx = pd.IndexSlice 
df.loc[:, idx['possible', 'possible']] -= 
(df.loc[:, idx[('A','B'),:]].astype(str) == 'n/a').sum(axis=1) * 4 
df.replace({'n/a':0}, inplace=True) 
print df  
    A B possible 
    a b possible 
0 23 23  100 
1 3 0  96 
2 54 54  100 
3 7 0  96 
4 32 32  100 
5 76 76  100 
+0

私は8分で受け入れることができます。これは完璧です。 –

+0

ありがとう、幸運! – jezrael

関連する問題