2016-07-06 4 views
1

Как добавить первые строки из двух разных столбцов блока данных вместе, так что если первая строка столбца A равна NaN, замените на значение из первой строки balance, в противном случае, добавьте первую строку столбца A и первую строку balance. И так же, как и столбец B. Идея заключается в использовании первой строки строки balnce для преобразования первой строки других столбцов «A» и «B». Я попытался использовать df.iloc[0], чтобы получить первую строку, но я не могу установить значение или добавить его:Как добавить значения из двух разных столбцов pandas dataframe

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 вам нужно combine_first или fillna, если нужно заменить NaN значениями другого столбца:

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 

Если потребность сумма двух столбцов с заменой NaN на 0 использование add с параметром fill_value:

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

Формулировка вопроса ФП оставляет желать лучшего. Предполагая, что нижний комментарий в их коде «A [0] должен быть 23, а B [0] должен быть 13 + 23 = 36», правильно описывает то, что они хотят, я думаю, что использование 'df.A.fillna (0)' обеспечило бы желаемый ответ. Вопрос должен быть лучше сформулирован. – Grr

Смежные вопросы