我有一个包含~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
但是,如果我在已经在数据框中的日期运行它,我只想用旧值替换旧值。
我一直在争论这个问题已经有一段时间了,并且无法弄清楚我需要怎么做,在正确格式化日期之间以便我可以检查数据框中是否有重复,以正确附加/连接/合并/等。旧的价值观与新的价值观。我有几个不同的地方,广义函数对我来说真的很有用,所以我希望有人遇到同样的问题并且有一个我可以使用的优雅解决方案。
提前致谢!
答案 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