Как создать столбец данных в сочетании с несколькими столбцами в пандах - PullRequest
0 голосов
/ 06 июля 2018

У меня есть некоторые данные, которые отслеживают изменения названий компаний с течением времени. Однако вместо того, чтобы каждое имя изменялось в одной строке, я хотел бы объединить их все в одном поле.

Входные данные могут быть построены с использованием:

#Import the modules:
import pandas as pd
import numpy as np

#Create the empty data frame:
df = pd.DataFrame(columns=['dt','old_name','new_name'])

#Populate the data frame:
df.loc[len(df)] = ['01/01/2001', 'AAA', 'BBB']
df.loc[len(df)] = ['02/02/2002', 'BBB', 'CCC']
df.loc[len(df)] = ['03/03/2003', 'CCC', 'DDD']

#View the output:
df

Как я хочу, чтобы вывод выглядел так, можно создать с помощью этого:

#Create the empty data frame:
end_df = pd.DataFrame(columns=['dt','name'])

#Populate:
end_df.loc[len(end_df)] = ['01/01/2001', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/02/2002', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['03/03/2003', 'AAA-BBB-CCC-DDD']

#View the output:
end_df

Редактировать: Я запускаю этот код в Pyspark2 с использованием фрейма данных Pandas - в случае, если это имеет какое-либо значение для синтаксиса. Кроме того, в моем наборе данных есть несколько групп имен. Под этим я подразумеваю, что существует больше групп изменений имен, не связанных с первой группой, чьи имена необходимо объединить.

Пример сгруппированного ввода:

#Create the empty data frame:
df = pd.DataFrame(columns=['dt','old_name','new_name'])

#Populate the data frame:
df.loc[len(df)] = ['01/01/2001', 'AAA', 'BBB']
df.loc[len(df)] = ['02/02/2002', 'BBB', 'CCC']
df.loc[len(df)] = ['03/03/2003', 'CCC', 'DDD']
df.loc[len(df)] = ['02/01/2001', 'XXX', 'YYY']
df.loc[len(df)] = ['03/02/2002', 'YYY', 'ZZZ']

Пример сгруппированного вывода:

#Create the empty data frame:
end_df = pd.DataFrame(columns=['dt','name'])

#Populate:
end_df.loc[len(end_df)] = ['01/01/2001', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/02/2002', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['03/03/2003', 'AAA-BBB-CCC-DDD']
end_df.loc[len(end_df)] = ['02/01/2001', 'XXX-YYY-ZZZ']
end_df.loc[len(end_df)] = ['03/02/2002', 'XXX-YYY-ZZZ']

Дайте мне знать, если вам нужны дальнейшие разъяснения.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

вам нужно np.flatten and np.unique

import numpy as np
end_df = pd.DataFrame(columns=['dt','name'])
end_df['dt']=df['dt'].copy()
flat=df[df.columns[1:]].values.flatten()
end_df['name']='-'.join(np.unique(flat))

print(end_df)
    dt          name
0   01/01/2001  AAA-BBB-CCC-DDD
1   02/02/2002  AAA-BBB-CCC-DDD
2   03/03/2003  AAA-BBB-CCC-DDD 
0 голосов
/ 06 июля 2018

Создано два dicts: old_new_dict для перехода от старого к новому имени и old_new_dict_rev для перехода от нового к старому имени:

old_new_dict = {k:v for k,v in zip(df.old_name,df.new_name)}          
old_new_dict_rev = {v:k for k,v in zip(df.old_name,df.new_name)}     

Функция find_tree, перемещается в обоих направлениях и соединяет их для создания полного пути имен.

def find_tree(name):
    left_list = []
    right_list = []
    name_l, name_r = name, name

    while(name_l in old_new_dict_rev):
        left_list.append(old_new_dict_rev[name_l])
        name_l = old_new_dict_rev[name_l]
    left_list.reverse()

    while(name_r in old_new_dict):
        right_list.append(old_new_dict[name_r])
        name_r = old_new_dict[name_r]

    return "-".join(left_list + [name] + right_list)

Добавить полный путь в виде столбца name в кадре данных df:

df['name'] = df['old_name'].apply(lambda x: find_tree(x))
end_df = df.drop(['old_name','new_name'], axis = 1)

end_df
#           dt             name
#0  01/01/2001  AAA-BBB-CCC-DDD
#1  02/02/2002  AAA-BBB-CCC-DDD
#2  03/03/2003  AAA-BBB-CCC-DDD
#3  02/01/2001      XXX-YYY-ZZZ
#4  03/02/2002      XXX-YYY-ZZZ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...