【问题标题】:Convert Python list of duplicate date entries/values to Pandas Dataframe sorted by date将重复日期条目/值的 Python 列表转换为按日期排序的 Pandas Dataframe
【发布时间】:2019-01-11 20:18:53
【问题描述】:

如何根据日期将包含多个条目、日期和值的列表转换为 Pandas 数据框?例如:

给定以下列表:

list_ex = [{'Date': '12/31/2018', 'A': 'N/A'}, 
{'Date': '09/30/2018', 'A': '$5.75'}, 
{'Date': '06/30/2018', 'A': '$5.07'}, 
{'Date': '03/31/2018', 'A': '$3.27'}, 
{'Date': '12/31/2018', 'B': 'N/A'}, 
{'Date': '09/30/2018', 'B': '$56,576.00'}, 
{'Date': '06/30/2018', 'B': '$52,886.00'}, 
{'Date': '03/31/2018', 'B': '$51,042.00'}]

我们如何将其转换为如下所示的 Dataframe(另外,其中将有 4 或 5 个附加列):

        Date      A             B
0  2018-12-31     N/A         N/A
1  2018-09-30   $5.75         $56,576.00
2  2018-06-30   $5.07         $52,886.0
3  2018-03-31   $3.27         $51,042.00

我进行了多次搜索,但找不到任何可以帮助解决此问题的示例。因此,我做了两次糟糕的尝试,但都没有接近预期的输出。

尝试 1:我将字符串值转换为日期,然后希望数据框创建会“自动”按日期分组,但这显然不起作用,因为每个新添加都有一个新索引。尝试 1 产生了相同的(基本上)df。

for i in list_ex:
i['Date'] = datetime.datetime.strptime(i['Date'], '%m/%d/%Y')

# Print Pandas dataframe
df = pd.DataFrame(list_ex) 
print(df)  

尝试 2:按日期排序。这显然失败了,因为它只是按日期排序并保持相同的行数。

new_df = pd.sort_values('Date')

感谢您的宝贵时间。

【问题讨论】:

    标签: python-3.x pandas datetime dataframe


    【解决方案1】:

    也许不是最简单或最有效的答案,但这是可行的。基本上我正在创建两个 DataFrame 对象,去掉所有的 nan,然后将它们合并到“日期”列中。

    import pandas as pd
    
    list_ex = [{'Date': '12/31/2018', 'A': 'N/A'},
               {'Date': '09/30/2018', 'A': '$5.75'},
               {'Date': '06/30/2018', 'A': '$5.07'},
               {'Date': '03/31/2018', 'A': '$3.27'},
               {'Date': '12/31/2018', 'B': 'N/A'},
               {'Date': '09/30/2018', 'B': '$56,576.00'},
               {'Date': '06/30/2018', 'B': '$52,886.00'},
               {'Date': '03/31/2018', 'B': '$51,042.00'}]
    
    df1 = pd.DataFrame(data=list_ex, columns=['Date', 'A']).dropna()
    df2 = pd.DataFrame(data=list_ex, columns=['Date', 'B']).dropna()
    
    df3 = pd.merge(df1, df2, on='Date')
    
    print(df3)
    

    祝你好运!

    【讨论】:

      【解决方案2】:

      您可以将groupby() 方法与.agg 方法结合使用,如下所示:

      df = pd.DataFrame(list_ex)
      
      df = df.groupby('Date').agg({'A': lambda x: list(x)[0],
                                   'B': lambda x: list(x)[1]}).reset_index()
      

      输出:

          Date        A       B
      0   03/31/2018  $3.27   $51,042.00
      1   06/30/2018  $5.07   $52,886.00
      2   09/30/2018  $5.75   $56,576.00
      3   12/31/2018  N/A     N/A
      

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2017-05-14
        • 2014-07-29
        相关资源
        最近更新 更多