在附加到pandas数据帧时创建新列

时间:2017-05-02 18:42:34

标签: python python-2.7 pandas dataframe

我有一个包含~12,000列和几百行的数据帧,如下所示:

Date     id1    id2    id3    id4    ...    id12000
1/4/16   100    78     103.5  15            35
1/5/16   100.5  78     104    16            37
1/6/16   99.5   78.5   104.5  16.5          37
1/7/16   100.1  77     104.2  13            37
1/8/16   100.3  76.5   104.2  13.5          33
1/11/16  99.8   77     103.7  13.5          34
...
5/1/17   101.1  82     103.6  12            33

每天,我都会获得一个需要添加到此数据框的新数据框。因此,举例来说,我可能会得到5月2日的数据框,如下所示:

Date     id1    id3    id4    id6    ...    id12100
5/2/17   100    103    12.5   15            100

但是这个数据框可能每天都会包含一些新的ID(列),并且它可能还有一些以前遗留的ID。

我希望我的新数据框在每次有新ID时添加列,并使用NaN填充该列的所有先前值。我也希望以前在数据帧中的任何ID单元格都填充NaN。因此,例如,上面两个示例数据框的连接看起来像:

Date     id1    id2    id3    id4    ...    id12000   id12100
1/4/16   100    78     103.5  15            35        NaN
1/5/16   100.5  78     104    16            37        NaN
1/6/16   99.5   78.5   104.5  16.5          37        NaN
1/7/16   100.1  77     104.2  13            37        NaN
1/8/16   100.3  76.5   104.2  13.5          33        NaN
1/11/16  99.8   77     103.7  13.5          34        NaN
...
5/1/17   101.1  82     103.6  12            33        NaN
5/2/17   100    NaN    103    12.5          NaN       100

但是,如果我在已经在数据框中的日期运行它,我只想用旧值替换旧值。

我一直在争论这个问题已经有一段时间了,并且无法弄清楚我需要怎么做,在正确格式化日期之间以便我可以检查数据框中是否有重复,以正确附加/连接/合并/等。旧的价值观与新的价值观。我有几个不同的地方,广义函数对我来说真的很有用,所以我希望有人遇到同样的问题并且有一个我可以使用的优雅解决方案。

提前致谢!

2 个答案:

答案 0 :(得分:3)

In [43]: df
Out[43]:
     Date    id1   id2    id3   id4
0  1/4/16  100.0  78.0  103.5  15.0
1  1/5/16  100.5  78.0  104.0  16.0
2  1/6/16   99.5  78.5  104.5  16.5

In [44]: new
Out[44]:
     Date  id1  id3   id4  id6  id12100
0  1/6/16   11   11  11.0   11      111
1  5/2/17  100  103  12.5   15      100

In [45]: df.set_index('Date').append(new.set_index('Date'))
Out[45]:
          id1  id12100   id2    id3   id4   id6
Date
1/4/16  100.0      NaN  78.0  103.5  15.0   NaN
1/5/16  100.5      NaN  78.0  104.0  16.0   NaN
1/6/16   99.5      NaN  78.5  104.5  16.5   NaN
1/6/16   11.0    111.0   NaN   11.0  11.0  11.0
5/2/17  100.0    100.0   NaN  103.0  12.5  15.0

答案 1 :(得分:2)

我认为您需要combine_first确保日期是两个数据框中的索引:

print(df)

           id1   id2    id3   id4  id12000
Date                                      
1/4/16   100.0  78.0  103.5  15.0       35
1/5/16   100.5  78.0  104.0  16.0       37
1/6/16    99.5  78.5  104.5  16.5       37
1/7/16   100.1  77.0  104.2  13.0       37
1/8/16   100.3  76.5  104.2  13.5       33
1/11/16   99.8  77.0  103.7  13.5       34
5/1/17   101.1  82.0  103.6  12.0       33

print(df_new)

        id1  id3   id4  id6  id12100
Date                                
5/2/17  100  103  12.5   15      100

使用combine_first将日期作为索引:

df_out = df_new.combine_first(df)
print(df_out)

输出:

           id1  id12000  id12100   id2    id3   id4   id6
Date                                                     
1/11/16   99.8     34.0      NaN  77.0  103.7  13.5   NaN
1/4/16   100.0     35.0      NaN  78.0  103.5  15.0   NaN
1/5/16   100.5     37.0      NaN  78.0  104.0  16.0   NaN
1/6/16    99.5     37.0      NaN  78.5  104.5  16.5   NaN
1/7/16   100.1     37.0      NaN  77.0  104.2  13.0   NaN
1/8/16   100.3     33.0      NaN  76.5  104.2  13.5   NaN
5/1/17   101.1     33.0      NaN  82.0  103.6  12.0   NaN
5/2/17   100.0      NaN    100.0   NaN  103.0  12.5  15.0