【问题标题】:Align dates on alternate columns Pandas Dataframe在备用列上对齐日期 Pandas Dataframe
【发布时间】:2018-05-04 18:38:19
【问题描述】:

我有一个 Pandas 数据框,第 1-3-5-7 列...包含日期,第 2-4-6-8-.. 列包含数据值。列中的日期不对应。 我想要一个包含所有日期的列,其余列只包含值 示例:

input

      date val1       date   val2        date val3 
2007-12-01 35.6  2007-12-05 101.1  2007-12-05 89.1
2007-12-02 36.7. 2007-12-06 102.3  2007-12-07 89.3
2007-12-05 36.7  2007-12-07 108.3. 2007-12-08 89.5
2007-12-06 36.9  2007-12-08 110.0  2007-12-09 89.3
2007-12-07 36.9. 2007-12-09 102.3  2007-12-12 89.9

output

      date   val1   val2   val3 
2007-12-01   35.6     na     na 
2007-12-02   36.7     na     na 
2007-12-05   36.7  101.1   89.1 
2007-12-06   36.9  102.3     na 
2007-12-07   36.9  108.3   89.3 
2007-12-08     na  110.0   89.5
2007-12-09     na  102.3   89.3
2007-12-12     na     na   89.9

【问题讨论】:

    标签: python pandas date alignment time-series


    【解决方案1】:

    您可以迭代地将所有几列连接到一个新的空数据框中。

    dft = pd.DataFrame({"date": []})
    N = len(df.columns)
    for n in range(N // 2):
        dft = dft.merge(df.iloc[:, 2*n:2*(n+1)], on='date', how='outer')
    

    请注意,我们定义了一个空列 date 以在第一次迭代时合并它。 'outer' 键表示要保留来自左侧(初始)和右侧(合并)数据帧的所有值,并在需要时添加 nans。希望这会有所帮助。

    【讨论】:

    • 数据确实很大,这就是为什么我正在寻找一种优雅而高效的方式来执行这项任务
    • 如果数据大于几GB,也许pyspark是更好的解决方案?
    • 您好,您可以查看我的编辑。代码现在很紧凑,可以使用任意数量的列运行。性能相当不错:800 000 行和 6 列,在我的机器上用时不到 3 秒。
    • 我认为这是一个很好的解决方案,但是在第一个循环后我得到一个错误:KeyError: 'date'
    • 该错误意味着您正在对不包含“日期”的列对调用合并操作。尝试运行print(df.keys()) 并仔细检查您拥有的所有列的名称。您可以将结果粘贴到此处,以便我们一起检查。
    【解决方案2】:

    你可以试试(可能会出现同名的列被重命名):

    df:
             date   val1      date.1    val2      date.2  val3
    0  2007-12-01   35.6  2007-12-05   101.1  2007-12-05  89.1
    1  2007-12-02  36.7.  2007-12-06   102.3  2007-12-07  89.3
    2  2007-12-05   36.7  2007-12-07  108.3.  2007-12-08  89.5
    3  2007-12-06   36.9  2007-12-08   110.0  2007-12-09  89.3
    4  2007-12-07  36.9.  2007-12-09   102.3  2007-12-12  89.9
    
    for index, i in enumerate(xrange(0,len(df.columns),2)):
        col = df.columns[i]
        name = 'df' + str(index)
        name = df.iloc[:,i:i+2]
        if index == 0:
            dft = name
        name.columns = ['date', ('value' + str(i/2+1))]
        if index !=0:
            dft = dft.merge(name, on='date', how='outer')
    print dft
    

    输出:

             date value1  value2  value3
    0  2007-12-01   35.6     NaN     NaN
    1  2007-12-02  36.7.     NaN     NaN
    2  2007-12-05   36.7   101.1    89.1
    3  2007-12-06   36.9   102.3     NaN
    4  2007-12-07  36.9.  108.3.    89.3
    5  2007-12-08    NaN   110.0    89.5
    6  2007-12-09    NaN   102.3    89.3
    7  2007-12-12    NaN     NaN    89.9
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      相关资源
      最近更新 更多