кадры данных панд, объединяющие строки в столбцы

1

У меня есть 2 кадра данных панд (df1, df2), из которых я пытаюсь извлечь данные и создать третий кадр данных (df3)

У df1 есть 2 столбца (столбец id и еще один столбец, в котором содержатся имена столбцов во 2-м кадре данных (df2)

df1 looks like:
===============
id1      name
---      ----
1        df2_column1_name
5        df2_column1_name
33       df2_column3_name
...
... and so on

df2 looks like:
===============
id2  df2_column1_name   df2_column2_name   df2_column2_name .... and so on
---  ----------------   ----------------   ----------------
12   Jimmy              male               25               .... 
16   Becky              female             30               ....
75   Mike               male               80               ....
....
.... and so on


I am trying to create df3 to look like:
=======================================
column1  Column2  Column3
-------  -------  -------
1        12       Jimmy    
5        12       male 
33       12       25
.
.
1        16       Becky
5        16       female
33       16       30
.
.
1        75       Mike
5        75       male
33       75       80
.
.
.

Рамки данных могут быть довольно большими. Я пытаюсь найти наиболее эффективный способ сделать это без двойного цикла, если это возможно. пожалуйста, посоветуйте лучший способ сделать это. Спасибо

Теги:
pandas

1 ответ

1
Лучший ответ

стек и слияние дает вам большую часть пути туда:

In [11]: df2.set_index("id2").stack().reset_index(name='value')
Out[11]:
   id2           level_1   value
0   12  df2_column1_name   Jimmy
1   12  df2_column2_name    male
2   12  df2_column3_name      25
3   16  df2_column1_name   Becky
4   16  df2_column2_name  female
5   16  df2_column3_name      30
6   75  df2_column1_name    Mike
7   75  df2_column2_name    male
8   75  df2_column3_name      80

In [12]: df2.set_index("id2").stack().reset_index(name='value').merge(df1, right_on="name", left_on="level_1")
Out[12]:
   id2           level_1   value  id1              name
0   12  df2_column1_name   Jimmy    1  df2_column1_name
1   16  df2_column1_name   Becky    1  df2_column1_name
2   75  df2_column1_name    Mike    1  df2_column1_name
3   12  df2_column2_name    male    5  df2_column2_name
4   16  df2_column2_name  female    5  df2_column2_name
5   75  df2_column2_name    male    5  df2_column2_name
6   12  df2_column3_name      25   33  df2_column3_name
7   16  df2_column3_name      30   33  df2_column3_name
8   75  df2_column3_name      80   33  df2_column3_name

Наконец, вы должны выбрать только те столбцы, которые хотите, и отсортировать:

In [13]: df2.set_index("id2").stack().reset_index(name='value').merge(df1, right_on="name", left_on="level_1")[["id1", "id2", "value"]].sort_v
     ...: alues("id2")
Out[13]:
   id1  id2   value
0    1   12   Jimmy
3    5   12    male
6   33   12      25
1    1   16   Becky
4    5   16  female
7   33   16      30
2    1   75    Mike
5    5   75    male
8   33   75      80
  • 0
    Спасибо. С небольшими изменениями я смог заставить его работать для моих нужд.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню