我正在将SQL查询的结果提取到我的Pandas数据框中。结果为“最小和最大”或“最小,最大和平均值”。
我想将“结果”列拆分为现有数据框中的单独列。我尝试了以下代码
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' )
我不知道如何解决此错误。
答案 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"],
],
如果您未更改此设置,则会收到注释中提到的错误。此外,我确定日期可能是日期时间对象,而不是我所显示的字符串。但这不会影响结果。