我使用 random.int 方法创建了一个 2 列 pandas df,以应用 groupby 操作生成第二个两列数据帧。 df.col1 是一系列列表,df.col2 一系列整数,列表内的元素类型为'numpy.int64',第二列的元素相同,作为随机的结果.int.
df.a df.b
3 7
5 2
1 8
...
groupby operations
df.col1 df.col2
[1,2,3...] 1
[2,5,6...] 2
[6,4,....] 3
...
当我尝试使用 Spark.createDataFrame(df) 构建 pyspark.sql 数据帧时,出现以下错误: 类型错误:不支持的类型:类型“numpy.int64”。
回到 df 生成,我尝试了不同的方法将元素从 numpy.int64 转换为 python int,但没有一个主题起作用:
np_list = np.random.randint(0,2500, size = (10000,2)).astype(IntegerType)
df = pd.DataFrame(np_list,columns = list('ab'), dtype = 'int')
我还尝试使用 lambda x: int(x) 或 x.item() 进行映射,但类型仍然是“numpy.int64”。
根据 pyspark.sql 文档,应该可以加载 pandas 数据帧,但是当它与 numpy 值一起使用时似乎不兼容。 有什么提示吗?
谢谢!
最佳答案
嗯,你的做法行不通。如果你有这样的事情。由于第一列,您将收到错误。 Spark 不理解类型为 numpy.int64 的列表
df.col1 df.col2
[1,2,3...] 1
[2,5,6...] 2
[6,4,....] 3
...
如果你有这样的事情。这个应该没问题。
df.a df.b
3 7
5 2
1 8
就您的代码而言,请尝试以下操作:
np_list = np.random.randint(0,2500, size = (10000,2))
df = pd.DataFrame(np_list,columns = list('ab'))
spark_df = spark.createDataFrame(df)
您实际上并不需要再次将其转换为 int
,如果您想显式执行此操作,则它是 array.astype(int)
。然后只需执行 spark_df.head
即可。这应该可行!
关于python - 将带有 Numpy 值的 pandas Dataframe 转换为 pysparkSQL.DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45411815/