2016-07-06 8 views
1

列Aの最初の行がNaNの場合は、balanceの最初の行の値に置き換えます。そうでない場合は、列Aの最初の行とbalanceの最初の行を追加します。他の列のAとBの最初の行を変換するためにbalnceの最初の行を使用しています。 df.iloc[0]を使用して最初の行を取得しようとしましたが、値を設定したり追加したりできません:2つの異なる列のパンダデータフレームから値を追加する方法

data = {'id': [1, 2, 3, 4, 5, 6], 
     'A': [None, None, 20, 10, 39, 30], 
     'B': [13, 98, 23, 45, 64, 10], 
     'balance': [23, 41, 12, 22, 32, 0]} 

df = pd.DataFrame(data) 
df = df.set_index('id') 
print df 

    A B balance 
id     
1 NaN 13 23 
2 NaN 98 41 
3 20 23 12 
4 10 45 22 
5 39 64 32 
6 30 10 0 

for i in df.columns: 
    if i not in ['balance']: 
     if df[i].iloc[0] == None: 
      df[i].iloc[0] = df['balance'].iloc[0] 
     else: 
      df[i].iloc[0] = df[i].iloc[0] + df['balance'].iloc[0] 

     print df[i] 


id 
1 NaN 
2 NaN 
3 20 
4 10 
5 39 
6 30 
Name: A, dtype: float64 


id 
1 36 
2 98 
3 23 
4 45 
5 64 
6 10 
Name: B, dtype: int64 
#A[0] should be 23, and B[0] should be 13 + 23 = 36 

所望の出力:

id A B  balance    
1 23 36  23 
2 NaN 98  41 
3 20 23  12 
4 10 45  22 
5 39 64  32 
6 30 10  0 
+0

最初の行のみですか? – ayhan

+0

あなたの散文説明はあなたのサンプルコードと一致しません。 * A *が空のときに* A *を*バランス*に設定しています。 – chrisaycock

+0

希望の出力は何ですか?カラムバランス? – jezrael

答えて

3

IIUC他の列の値によってNaNを交換する必要がある場合は、combine_firstfillnaが必要になります。

print (df.A.combine_first(df.B)) 
id 
1 13.0 
2 98.0 
3 20.0 
4 10.0 
5 39.0 
6 30.0 
Name: A, dtype: float64 

または:

print (df.A.fillna(df.B)) 
id 
1 13.0 
2 98.0 
3 20.0 
4 10.0 
5 39.0 
6 30.0 
Name: A, dtype: float64 


print (df.A.combine_first(df.B) + df.B) 
id 
1  26.0 
2 196.0 
3  43.0 
4  55.0 
5 103.0 
6  40.0 
dtype: float64 

場合は交換と必要性の合計2列NaNパラメータfill_valueで使用add0へ:

print (df.A.add(df.B, fill_value=0)) 
id 
1  13.0 
2  98.0 
3  43.0 
4  55.0 
5 103.0 
6  40.0 
dtype: float64 

EDIT:

は次のものが必要です。

df.ix[1,'A'] = df.ix[1,'balance'] 
print (df) 
     A B balance 
id     
1 23.0 13  23 
2 NaN 98  41 
3 20.0 23  12 
4 10.0 45  22 
5 39.0 64  32 
6 30.0 10  0 

EDIT1:

df.ix[1,'A'] = df.ix[1,'balance'] 
df.ix[1,'B'] = df.ix[1,'B'] + df.ix[1,'balance'] 

print (df) 
     A B balance 
id     
1 23.0 36  23 
2 NaN 98  41 
3 20.0 23  12 
4 10.0 45  22 
5 39.0 64  32 
6 30.0 10  0 
+0

OPは「A [0]は23でなければならない」と述べている。 – chrisaycock

+0

私の解決策は推測のみです。出力が不良であるか、またはすべてが悪い場合は削除します。 – jezrael

+0

OPの質問の表現が貧弱です。コード "A [0]は23で、B [0]は13 + 23 = 36でなければなりません"とし、 'df.A.fillna(0)'を使うと、希望の答え。質問はより明確にする必要があります。 – Grr

関連する問題