Как заполнить новый столбец на основе значений в других столбцах? - PullRequest
2 голосов
/ 07 октября 2019

Я хочу создать и заполнить новый столбец значением, основанным на том, имеет ли столбец значение в нем. У меня есть три столбца для сравнения, и есть заказы, для которых я бы предпочел заполнить значения.

Допустим, у меня есть 3 столбца (ABC), и я хочу заполнить новый столбец (Y) значением в AB или C, но я хочу ранжировать их. Таким образом, если столбец A имеет значение, которое я хочу, заполнить столбец Y с приоритетом над столбцами B и C. Если B имеет значение, он имеет приоритет над C, а столбец C имеет приоритет над ничем.

Что у меня есть:

A   B   C   Y        
1   NA  NA             
NA  2   NA
NA  3   NA
NA  NA  4        
5   NA  NA
6   6   NA
7   NA  NA
NA  NA  8
9   NA  9
10  10  10

Что я хочу:

A   B   C   Y        
1   NA  NA  1           
NA  2   NA  2
NA  3   NA  3
NA  NA  4   4     
5   NA  NA  5
6   6   NA  6
7   NA  NA  7
NA  NA  8   8
9   NA  9   9
10  10  10 10

Ответы [ 3 ]

1 голос
/ 07 октября 2019

Используйте np.where() для векторизованного подхода.

df['Y'] = np.where(df['A'] != np.nan, df['A'], df['B'])
df['Y'] = np.where(df['B'] == np.nan, df['C'], df['Y'])

Поскольку у вас нет df, который можно повторно использовать в вашем вопросе, я просто написал строку метода, которая вам нужна.

В следующий раз, когда вы зададите вопрос, пожалуйста, включите фрагменткода, который можно использовать для проверки возможного ответа / с. Добро пожаловать в сообщество: D

Если NA в вашем DataFrame является строкой:

Приведенный выше код не будет работать, используйте фактическое строковое значение для анализа черезdataframe.

df['Y'] = np.where(df['A'] != "NA", df['A'], df['B'])
df['Y'] = np.where(df['B'] == "NA", df['C'], df['Y'])

Последнее примечание, другой возможный ввод - когда все три столбца имеют значения NA.

Это не указано в вашем вопросе, но если вы хотите захватить этот экземпляр, просто добавьте новую строку, чтобы проверить значения в столбце C.

Затем в ложное возвращаемое значение поместите значение, которое вы хотите использовать, если значение C также равно NA.

0 голосов
/ 07 октября 2019

Вы можете использовать pandas для построения структуры данных, а затем осторожное использование функции apply() поможет вам получить нужное преобразование.

import pandas as pd
import math

data = (
  [1,    None, None,],
  [None, 2   , None,],
  [None, 3   , None,],
  [None, None, 4,   ],
  [5   , None, None,],
  [6   , 6   , None,],
  [7   , None, None,],
  [None, None, 8,   ],
  [9   , None, 9,   ],
  [10,   10,   10,  ],
)

df = pd.DataFrame(columns=('A', 'B', 'C'))

# Load in data
for row in data:
  df = df.append(pd.Series(row, index=df.columns), ignore_index=True)
print(df)

def calc_y(row):
  for item in row:
    if not math.isnan(item): 
      return item

df['Y'] = df.apply(calc_y, axis=1)

print(df)
0 голосов
/ 07 октября 2019

Отличный вопрос! Я думаю, что есть много способов приблизиться к этому. Мне сразу же приходит в голову использовать цикл, который преобразует каждую строку в серию, а затем заполняет столбец Y первой записью в этой серии, которая не является значением «NA». Общий код будет выглядеть так:

for row in DF: 
     temp_series = pd.Series(row)
     for entry in temp_series:
          if entry==NA:
                continue
          else:
                df.iloc[row,3] = entry #3 = Y col index

Опять же, это не точное решение для копирования и вставки, но эта методология должна дать вам то, что вы хотите. Удачи и удачного кодирования!

Редактировать: И от одного нового пользователя к другому, добро пожаловать в сообщество!

...