Сохраните значения, присвоенные одному столбцу в новом фрейме данных

#python #pandas

Вопрос:

У меня есть набор данных с тремя столбцами:

 Name Customer Value
Johnny Mike     1
Christopher Luke 0
Christopher Mike 0
Carl        Marilyn 1
Carl        Stephen 1
 

Мне нужно создать новый набор данных, в котором у меня есть два столбца: один с уникальными значениями из Name Customer столбцов и и Value столбец. Значения в Value столбце были присвоены Name (это означает, что несколько строк с одинаковыми Name значениями имеют одинаковое значение: у Карла значение 1, у Кристофера значение 0, а у Джонни значение 1), поэтому Customer элементы должны иметь пустые значения в Value столбце в новом наборе данных.
Мой ожидаемый результат таков

 All        Value
Johnny       1
Christopher  0
Carl         1
Mike
Luke
Marilyn
Stephen
 

Для уникальных значений в All столбце я рассматриваю unique().to_list() как Name и Customer :

 name = file['Name'].unique().tolist()
customer = file['Customer'].unique().tolist()
all_with_dupl = name   customer
customers=list(dict.fromkeys(all_with_dupl))

df= pd.DataFrame(columns=['All','Value'])
df['All']= customers
 

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

Ответ №1:

Разделите столбцы и .drop_duplicates фрейм данных, чтобы удалить дубликаты, а затем append верните их обратно:

 (df.drop('Customer', 1)
   .drop_duplicates()
   .rename(columns={'Name': 'All'})
   .append(
     df[['Customer']].rename(columns={'Customer': 'All'})
       .drop_duplicates(),
     ignore_index=True
   ))

           All  Value
0       Johnny    1.0
1  Christopher    0.0
2         Carl    1.0
3         Mike    NaN
4         Luke    NaN
5      Marilyn    NaN
6      Stephen    NaN
 

Или разделить ступеньки вверх:

 names = df.drop('Customer', 1).drop_duplicates().rename(columns={'Name': 'All'})
customers = df[['Customer']].drop_duplicates().rename(columns={'Customer': 'All'})
names.append(customers, ignore_index=True)
 

Ответ №2:

Другим способом

  d=dict(zip(df['Name Customer'].str.split('s').str[0],df['Value']))#Create dict
    df['Name Customer']=df['Name Customer'].str.split('s')
    df=df.explode('Name Customer').drop_duplicates(keep='first').assign(Value='')Explode dataframe and drop duplicates
    df['Value']=df['Name Customer'].map(d).fillna('')#Map values back