【问题标题】:Create new columns while appending to pandas dataframe在附加到熊猫数据框时创建新列
【发布时间】:2017-05-02 18:42:33
【问题描述】:

我有一个大约 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

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

我一直在为这个问题争论一段时间,但不知道我需要怎么做,在正确格式化日期之间,以便我可以检查数据框中是否有重复,正确附加/加入/合并/等。旧值与新值。我有几个不同的地方,通用函数对我非常有用,所以我希望有人遇到同样的问题并且有一个我可以使用的优雅的解决方案。

提前致谢!

【问题讨论】:

    标签: python python-2.7 pandas dataframe


    【解决方案1】:
    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
    

    【讨论】:

      【解决方案2】:

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

      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 和 Date 作为索引:

      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
      

      【讨论】:

      • 我知道会有一些我还没有想到的单行答案。太好了,谢谢!
      猜你喜欢
      • 2014-01-03
      • 1970-01-01
      • 2019-03-10
      • 2016-08-28
      • 2016-08-07
      • 2019-04-01
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多