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

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

У меня есть пара игрушечных фреймов данных, которые я могу складывать с помощью df.append , но мне также нужно сохранить исходные фреймы данных в виде столбца. Кажется, я ничего не могу найти о том, как это сделать. Вот что у меня есть:

 d2005 = pd.DataFrame({"A": [1,2,3,4], "B": [2,4,5,6], "C": [3,5,7,8],
                     "G": [7,8,9,10]})
d2006 = pd.DataFrame({"A": [2,1,4,5], "B": [3,1,5,6], "D": ["a","c","d","e"],
                     "F": [7,8,10,12]})


    d2005

    A   B   C   G
0   1   2   3   7
1   2   4   5   8
2   3   5   7   9
3   4   6   8   10


d2006

    A   B   D   F
0   2   3   a   7
1   1   1   c   8
2   4   5   d   10
3   5   6   e   12
  

Тогда я могу сложить их следующим образом:

 d_combined = d2005.append(d2006, ignore_index = True, sort = True)

d_combined

    A   B   C    D     F       G
0   1   2   3.0     NaN     NaN     7.0
1   2   4   5.0     NaN     NaN     8.0
2   3   5   7.0     NaN     NaN     9.0
3   4   6   8.0     NaN     NaN     10.0
4   2   3   NaN     a   7.0     NaN
5   1   1   NaN     c   8.0     NaN
6   4   5   NaN     d   10.0    NaN
7   5   6   NaN     e   12.0    NaN
  

Но что мне действительно нужно, так это еще один столбец с исходным фреймом данных, добавленным в правый конец d_combined . Что-то вроде этого:

     A   B   C       D       G       F      From
0   1   2   3.0     NaN     7.0     NaN     d2005
1   2   4   5.0     NaN     8.0     NaN     d2005
2   3   5   7.0     NaN     9.0     NaN     d2005
3   4   6   8.0     NaN     10.0    NaN     d2005
4   2   3   NaN     a       NaN     7.0     d2006
5   1   1   NaN     c       NaN     8.0     d2006
6   4   5   NaN     d       NaN     10.0    d2006
7   5   6   NaN     e       NaN     12.0    d2006
  

Надеюсь, у кого-нибудь есть быстрый трюк, которым они могут поделиться.
Спасибо.

Ответ №1:

Это дает то, что вы хотите, но должен быть более элегантный способ:

 df_list = [d2005, d2006]
name_list = ['2005', '2006']
for df, name in zip(df_list, name_list):
  df['from'] = name
  

Затем

 d_combined = d2005.append(d2006, ignore_index=True)
d_combined

    A   B   C       D      F        G       from
0   1   2   3.0     NaN     NaN     7.0     2005
1   2   4   5.0     NaN     NaN     8.0     2005
2   3   5   7.0     NaN     NaN     9.0     2005
3   4   6   8.0     NaN     NaN     10.0    2005
4   2   3   NaN     a       7.0     NaN     2006
5   1   1   NaN     c       8.0     NaN     2006
6   4   5   NaN     d       10.0    NaN     2006
7   5   6   NaN     e       12.0    NaN     2006
  

В качестве альтернативы, вы можете установить df.name во время создания df и использовать его в цикле for.

 d2005 = pd.DataFrame({"A": [1,2,3,4], "B": [2,4,5,6], "C": [3,5,7,8],
                     "G": [7,8,9,10]} )
d2005.name = 2005
d2006 = pd.DataFrame({"A": [2,1,4,5], "B": [3,1,5,6], "D": ["a","c","d","e"],
                     "F": [7,8,10,12]})
d2006.name = 2006  



df_list = [d2005, d2006]
    for df in df_list:
      df['from'] = df.name
  

Ответ №2:

Я считаю, что этого можно просто достичь, добавив столбец From к самим исходным фреймам данных. Так эффективно,

 d2005 = pd.DataFrame({"A": [1,2,3,4], "B": [2,4,5,6], "C": [3,5,7,8],
                 "G": [7,8,9,10]})
d2006 = pd.DataFrame({"A": [2,1,4,5], "B": [3,1,5,6], "D": ["a","c","d","e"],
                     "F": [7,8,10,12]})
  

Затем,

 d2005['From'] = 'd2005'
d2006['From'] = 'd2006'
  

И затем вы добавляете,

 d_combined = d2005.append(d2006, ignore_index = True, sort = True)
  

дает вам что-то вроде этого:

введите описание изображения здесь