Python、Postgres和具有空值的整数?
所以我有一些相当稀疏的数据列,其中大多数值为空,但有时有一些整数值。在Python中,如果有一个空格,那么该列将被解释为一个浮点,并且每个数字的末尾都有一个.0 我尝试了两件事: 将所有列更改为文本,然后从所有内容中删除.0 用0填充空格,并使每列成为整数 剥离.0是一种每天花费大约2mil+行的时间,然后数据是文本格式的,这意味着我不能做快速求和之类的事情 填充空格似乎有些浪费,因为有些列实际上只有数百万个实际值。我的表在一个月内已经超过了80gigs 200列,但是在大约30列之后的许多列都非常稀疏 什么样的postgres数据类型最适合这种情况?没有小数,因为列包含秒数,并且必须由应用程序预先四舍五入 编辑-以下是我目前正在做的事情,但这会增大尺寸,看起来很浪费:Python、Postgres和具有空值的整数?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,所以我有一些相当稀疏的数据列,其中大多数值为空,但有时有一些整数值。在Python中,如果有一个空格,那么该列将被解释为一个浮点,并且每个数字的末尾都有一个.0 我尝试了两件事: 将所有列更改为文本,然后从所有内容中删除.0 用0填充空格,并使每列成为整数 剥离.0是一种每天花费大约2mil+行的时间,然后数据是文本格式的,这意味着我不能做快速求和之类的事情 填充空格似乎有些浪费,因为有些列实际上只有数百万个实际值。我的表在一个月内已经超过了80gigs 200列,但是在大约30列之后的许多列都
def create_int(df, col):
df[col].fillna(0, inplace=True)
df[col] = df[col].astype(int)
如果我尝试在不填写0的情况下创建列astypeint,则会出现错误:
错误:无法将NA转换为整数
这是关于这个问题的链接
所以它使每个int都成为一个float。我应该把postgres中的数据类型改成数字还是什么?我不需要高精度,因为小数点后没有值 您可以利用使用POSTGRESQL 9.3或更高版本的事实,通过将数据转换为Python字典,然后使用JSON数据类型JSONB来实现穷人的稀疏行 以下Python代码片段以您所说的格式生成随机数据,将其转换为适当的json,并将其上载到带有JSONB列的PostgreSQL表中
import psycopg2
import json
import random
def row_factory(n=200, sparcity=0.1):
return [random.randint(0, 2000) if random.random() < sparcity else None for i in range(n)]
def to_row(data):
result = {}
for i, element in enumerate(data):
if element is not None: result[i] = element
return result
def from_row(row, lenght=200):
result = [None] * lenght
for index, value in row.items():
result[int(index)] = value
return result
con = psycopg2.connect("postgresql://...")
cursor = con.cursor()
cursor.execute("CREATE TABLE numbers (values JSONB)")
def upload_data(rows=100):
for i in range(rows):
cursor.execute("INSERT INTO numbers VALUES(%s)", (json.dumps(to_row(row_factory(sparcity=0.5))),) )
upload_data()
# To retrieve the sum of all columns:
cursor.execute("""SELECT {} from numbers limit 10""".format(", ".join("sum(CAST(values->>'{}' as int))".format(i) for i in range(200))))
result = cursor.fetchall()
我花了一段时间才了解如何在Postgresql中对JSONB数据执行数字操作,如果您要从Python中使用它们,您可以使用上面的snippet from_row函数。但最后两行有一个Select操作,它对所有列执行求和操作—Select语句本身是使用Python字符串格式方法组装的—将Json值用作数字的关键是使用->>运算符选择它,然后将其转换为数字。sumCASTvalues->“0”作为int部分这些为null表示不存在任何数据。例如,列可能是事件处于特定状态的秒数。由于状态从未出现,因此此列没有数据。如果我使用fillna方法,则会发生0秒。您从何处获取数据列?由于我在使用Pandas修改数据后使用Python加载数据,因此如果存在空值,我无法分配列astype int。Python创建一个浮点。如果列是整数类型,我无法将它们加载到数据库中,因为它会说1440.0之类的内容与预期的数据类型或类似的内容不匹配。您能创建一点吗?如果只使用浮点和int包装它,会发生什么情况?即使有大量数据,也应该能很快地将文本从浮点转换为int。