首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的SQL输出--如何将dataframe中的所有元组转换为字符串

python中的SQL输出--如何将dataframe中的所有元组转换为字符串
EN

Stack Overflow用户
提问于 2020-12-06 20:47:10
回答 3查看 750关注 0票数 2

我使用jpypejaydebeapi连接到一个运行良好的Oracle数据库。但是,SQL返回元组,而不是在每个字符之后返回带有括号和逗号的字符串。

它不是dog,而是返回(d,o,g,)

在DBeaver或蟾蜍中运行相同的SQL语句将返回字符串,而不会像您预期的那样进行更改。

请知道如何返回没有括号和逗号的字符串吗?(我仍然可以使用这些数据,但它在图表中看起来很奇怪,使得图表和其他输出更难阅读)。

我已经在谷歌和堆栈溢出搜索过类似的问题(link1link2link3),但这些解决方案中没有一个对我有用。我需要找到一种方法循环遍历所有列,以找到那些具有dtype字符串的列,然后将其中的所有元组连接起来。

以下是数据返回方式的屏幕截图:

下面是枢轴的屏幕截图(显示数据可以不用括号和逗号使用):

下面是一个图表的屏幕截图(再次显示带有括号和逗号的字符串):

我用于连接的代码如下(据我所见,这没有问题吗?):

代码语言:javascript
复制
import jpype, jaydebeapi 

import pandas as pd

jpype.startJVM(f"-Djava.class.path=D:\jdbc\ojdbc8.jar")

url = "jdbc:oracle:thin:@(DESCRIPTION=(CONNECT_TIMEOUT=1000)(TRANSPORT_CONNECT_TIMEOUT=1000)(ADDRESS_LIST=(LOAD_BALANCE=ON)(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT=""))(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT=""))(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT="")))(ADDRESS_LIST=(LOAD_BALANCE=ON)(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT=""))(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT=""))(ADDRESS=(PROTOCOL=TCP)(HOST="")(PORT="")))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME="")))"

user = "" 
password = "" 

conn=jaydebeapi.connect("oracle.jdbc.OracleDriver", url, [user, password])

cursor = conn.cursor()

sql_query = ''''''

cursor.execute(sql_query)
data = cursor.fetchall()

columns = [desc[0] for desc in cursor.description]
columns = [''.join(i) for i in columns]

cursor.close()
data = pd.DataFrame(data)
data.columns = columns

pd.options.display.float_format = '{:,.0f}'.format
pivot = pd.pivot_table(data, index=['COUNTRY'], values=['CUSTOMERS'], aggfunc=(sum))

pivot.plot(kind='bar')

conn.close()
jpype.shutdownJVM()

以下是我到目前为止尝试过的:

代码语言:javascript
复制
for col in data.columns:
    for ix in data.index:
        data[ix][col] = ''.join(data[ix][col])

这将返回

键错误:0

代码语言:javascript
复制
data.select_dtypes(include=['object']).agg(' '.join)

#and

data.select_dtypes(include=['object']).apply(lambda x: ''.join(x))

这两个返回a

TypeError:序列项0:预期的str实例,java.lang.String找到

当然,我已经查找了这些错误消息,但是我无法判断我做错了什么。

我真的很感激你的帮助!

谢谢!

UPDATE: --我刚刚注意到,当我将dtype object转换为category时(我这样做是为了在透视表中对列进行排序),它显示了没有方括号和逗号的字符串。因此,我尝试使用以下代码将所有object列转换为category

代码语言:javascript
复制
data = pd.concat([
        data.select_dtypes([], ['object']),
        data.select_dtypes(['object']).apply(pd.Series.astype, dtype='category')
        ], axis=1).reindex(data.columns, axis=1) 

但是,现在我得到了以下错误:

ValueError:用序列设置数组元素

如果我一个一个地做每一列,它似乎在起作用:-S

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-14 22:02:59

您可以尝试为您的data dataFrame运行以下命令:

代码语言:javascript
复制
for col in data.select_dtypes(include=['object']).columns:
    data[col] = data[col].apply(lambda x: ''.join(x) if x is not None else x)

它应该遍历包含文本或混合数值和非数字值的所有列,并将元组元素转换为字符串。

票数 0
EN

Stack Overflow用户

发布于 2020-12-09 11:11:38

我认为有两个问题/方法可以解决这个问题:

第一种方法是解决“症状”,即处理得到的奇怪输出,并将其转换为表示应该是什么。这可以使用str.replace和str.join/str.split来完成:

''.join(','.split("('d','o','g')".replace('(','').replace (')','')))

然而,第二个也是更好的方法是解决根本问题。我不知道问题出在哪里,但是试着用调试器逐行执行代码,看看这个格式错误的字符串首先出现在哪里。

票数 0
EN

Stack Overflow用户

发布于 2021-04-30 11:17:17

而不是治疗症状:问题的原因似乎在于使用jpype (也请参阅这就是答案和评论)。

为了防止问题首先发生,您可以更改连接,例如通过以下两种方式之一:

  1. 使用没有jaydebeapijpype: 当这个问题发生在我身上时,我注意到使用jpype毕竟是不必要的。我将驱动程序作为一个.jar文件(在我的示例中是在同一目录中的本地文件)传递给jaydebeapi.connect(),并且我的连接在没有jpype的情况下运行良好: 进口jaydebeapi为jdba进口大熊猫为pd db_host = 'db.host.com‘db_port = 1521 db_sid = 'YOURSID’jar=os.getcwd()+/ojdbc6.jar‘conn =ojdbc6.jar’conn=ojdbc6.jar‘jjdbc6.jar’conn=ojdbc6.jar=jdba导入大熊猫db_host =‘db.host.com’db_port=1521 db_sid =‘YOURSID’jar=os.getcwd()+/ojdbc6.jar‘conn=ojdbc6.jar’cjdbc6.jar‘conn=ojdbc6.jar:db_port:瘦:@@’+db_host+ ':‘+ str(db_port) + ':’+db_sid‘,{’‘密码’:‘密码’},jar ) df_jay = pd.read_sql('SELECT *从YOURSID.table 1‘,康涅狄格) conn.close() 这就没有问题地创建了dataframe。
  2. 使用cx_Oracle代替: 当我使用cx_Oracle连接到Oracle时,也没有发生此问题: 进口cx_Oracle进口大熊猫为pd进口os db_host = 'db.host.com‘db_port = 1521 db_sid = 'YOURSID’dsn_tns = cx_Oracle.makedsn(db_host,db_port,db_sid) cx_conn =cx_Oracle.connect(‘用户名’,‘密码’,dsn_tns) df_cxo = pd.read_sql('SELECT * FROM YOURSID.table1,con=cx_conn) cx_conn.close( 注意:要使cx_Oracle工作,您必须安装并正确设置Oracle即时客户端 (参见Oracle Ubuntu文档)。

如果其中一种方法对您来说是一种选择,那么首先就可以防止整个问题的发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65172923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档