Стек двух кадров данных панд с разными столбцами, сохраняя исходный кадр данных как столбец, а также - PullRequest
0 голосов
/ 18 марта 2019

У меня есть пара игрушечных фреймов данных, которые я могу сложить, используя 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

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

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

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

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
1 голос
/ 18 марта 2019

Я полагаю, что это может быть просто достигнуто путем добавления столбца 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)

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...