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

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

Vis POS FAMID   G1ID    G2ID    G1B   G2B1  G2B2  G2B3  G1R   G2R1   G2R2  G2R3                                                                  
1   0   1       100011          1979  2010              White White      
1   1   1               200011                                                   
1   0   2       100021          1969  2011  2009        AA    AA     White                                                                       
1   1   2               200021                                                   
1   2   2               200022                                                   
1   0   3       100031          1966  2008  2010  2011  White White   AA    AA                                                       
1   1   3               200031                                                              
1   2   3               200032                                                           
1   3   3               200033

G1 = данные опекуна

G2 = данные ребенка

GxBx = год рождения

GxRx = race

OUTPUT

Visit   POS FAMID   G1      G2      G1Birth     G2Birth     G1Race  G2Race
1       0   1       100011          1979                    White   
1       1   1               200011              2010                White
1       0   2       100021          1969                    AA  
1       1   2               200021              2011                AA
1       2   2               200022              2009                White
1       0   3       100031          1966                    White   
1       1   3               200031              2008                White
1       2   3               200032              2010                AA
1       3   3               200033              2011                AA

Из этих двух таблиц видно, что все столбцы G2Bx должны попадать в новый столбец G2Birth, и тот же принцип для столбцов G2Rx.(На самом деле у меня есть еще несколько примеров, таких как раса и год рождения в моих реальных данных)

Я изучал опорные точки и функции суммирования в кадре данных панд, но я не совсем получил то, что хотел.Самым близким, что я получил, было использование функции плавления, но у меня возникла проблема с функцией плавления, заключающаяся в том, что я не мог заставить ее отобразить индексы, не беря все значения из этого столбца.IE хочет создать строку для child2 и child3 для людей, у которых есть только child1.Возможно, я просто неправильно использую функцию melt.

Я хочу, чтобы все значения из g2Birthdate1 отображались в POS, когда POS = 1, и все g2Birthdate2 в индекс POS = 2 и т. Д. Есть ли функция, котораяможет помочь достичь этого?Или для этого требуется дополнительное решение для кодирования?

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете сделать это со строкой и столбцом MultiIndex и левым соединением:

# df is your initial dataframe

# Make a baseline dataframe to hold the IDs
id_df = df.drop(columns=[c for c in df.columns if c not in ["G1ID", "G2ID","Vis","FAMID","POS"]])

# Make a rows MultiIndex to join on at the end
id_df = id_df.set_index(["Vis","FAMID","POS"])

# Rename the columns to reflect the hierarchical nature 
data_df = df.drop(columns=[c for c in df.columns if c in ["G1ID", "G2ID", "POS"]])

# Make the first two parts of the MultiIndex required for the join at the end
data_df = data_df.set_index(["Vis","FAMID"])

# Make the columns also have a MultiIndex
data_df.columns = pd.MultiIndex.from_tuples([("G1Birth",0),("G2Birth",1),("G2Birth",2),("G2Birth",3),
                                             ("G1Race",0),("G2Race",1),("G2Race",2),("G2Race",3)])

# Name the columnar index levels
data_df.columns.names = (None, "POS")

# Stack the newly formed lower-level into the rows MultiIndex to complete it in prep for joining
data_df = data_df.stack("POS")

# Join to the id dataframe on the full MultiIndex
final = id_df.join(data_df)
final = final.reset_index()
...