将具有不同数量元素的列表拆分为数据帧中的单独列

时间:2019-05-13 12:52:49

标签: pandas list

我正在将SQL查询的结果提取到我的Pandas数据框中。结果为“最小和最大”或“最小,最大和平均值”。

Min Max Data frame

我想将“结果”列拆分为现有数据框中的单独列。我尝试了以下代码

df[["Max","Min", "Average"]] = df.apply(lambda x: pd.Series({"Min_value": x[-1][0], "Max_value": x[-1][1], "Avg_value": x[-1][2]}), axis=1)

样本输出:

Data = {'SQL_Query': ['SELECT MIN([Batch_Date_Time]) as Min_value, MAX([Batch_Date_Time]) as Max_value FROM [dbo].[dq_account]', 'SELECT MIN([Trxn_amt]) as Min_value, MAX([Trxn_amt]) as Max_value, AVG([Trxn_amt]) as Avg_value FROM [dbo].[dq_trxn]', 'SELECT MIN([Trxn_date]) as Min_value, MAX([Trxn_date]) as Max_value FROM [dbo].[dq_trxn]'],
                  'Results': ['[2019-04-01 00:00:00, 2099-04-30 00:00:00]', '[-1991.0, 8910.22, 1912.4404615384615]', '[2019-04-01, 2099-04-30]'],
                  'Min':  ['2019-04-01 00:00:00', '-1991.0', '2019-04-01'],
                  'Max': ['2099-04-30 00:00:00', '8910.22', '2099-04-30'],
                  'Avg': ['NA', '1912.4404615384615', 'NA']}

df = pd.DataFrame(Data,columns= ['SQL_Query', 'Results', 'Min', 'Max', 'Avg'])

但是,由于查询1和3的结果中不存在元素'2',所以出现错误-IndexError:('行索引超出范围index = 2 len = 2','发生在索引0' )

我不知道如何解决此错误。

2 个答案:

答案 0 :(得分:0)

如果您的SQL查询始终是有序的:首先是最大值,然后是最小值,然后是平均值,则可以:

def _split(x):
   max_=None if len(x)==2 else x[2]
   return pd.Series({"Min_value": x[0], "Max_value": x[1], "Avg_value": max_})

df[["Max","Min", "Average"]] = df['Results'].apply(lambda x: _split(x),axis=1)

否则,您必须解析每一行的查询以确定顺序

答案 1 :(得分:0)

在上面的DF中,我已将日期更改为列表中的字符串。向量化解决方案由tolist()提供。

pd.concat([df['SQL_Query'],pd.DataFrame(df.Results.values.tolist(), columns=['Min', 'Max', 'Avg'])], axis=1)



    SQL_Query           Min                     Max                     Avg
0   SELECT MIN([Bat...  2019-04-01 00:00:00     2099-04-30 00:00:00     NaN
1   SELECT MIN([Trx...  -1991                   8910.22                 1912.440461
2   SELECT MIN([Trx...  2019-04-01              2099-04-30              NaN

编辑

我应该已经按照上面的评论提供了更改数据的详细信息。我已经修改了数据,使其成为列表而不是一个字符串。

 "Results": [
        ["2019-04-01 00:00:00", "2099-04-30 00:00:00"],
        [-1991.0, 8910.22, 1912.440461],
        ["2019-04-01", "2099-04-30"],
    ],

如果您未更改此设置,则会收到注释中提到的错误。此外,我确定日期可能是日期时间对象,而不是我所显示的字符串。但这不会影响结果。