堆叠两个具有不同列的pandas数据框,同时将源数据框保留为列

时间:2019-03-18 04:44:43

标签: python-3.x pandas dataframe

我有几个玩具数据帧,可以使用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 个答案:

答案 0 :(得分:2)

这可以满足您的要求,但是应该有一种更优雅的方法:

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时设置df.name并将其用于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 :(得分:1)

我相信可以通过在原始数据框本身中添加 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