如何在Python中根据长度不同的列表创建数据框架?

时间:2018-11-19 16:25:49

标签: python python-3.x pandas pyspark

我正在使用PySpark Python3-Spark 2.1.0,并且具有差异列表的列表,例如:

lista_archivos = [[['FILE','123.xml'],['NAME','ANA'],['SURNAME','LÓPEZ'],
['BIRTHDATE','05-05-2000'],['NATIONALITY','ESP']], [['FILE','458.xml'],
['NAME','JUAN'],['SURNAME','PÉREZ'],['NATIONALITY','ESP']], [['FILE','789.xml'],
['NAME','PEDRO'],['SURNAME','CASTRO'],['BIRTHDATE','07-07-2007'],['NATIONALITY','ESP']]]

此列表包含不同长度的元素。所以现在,我想从此列表创建一个DataFrame,其中的列是第一个属性(即'FILE,NAME,SURNAME,BIRTHDATE,NATIONALITY),而数据是第二个属性。

如您所见,第二个列表没有'BIRTHDATE'列,我需要DataFrame来在此位置使用NaN或空格创建此列。

此外,我需要DataFrame像这样:

FILE      NAME    SURNAME    BIRTHDATE   NATIONALITY
----------------------------------------------------
123.xml    ANA     LÓPEZ     05-05-2000    ESP

458.xml    JUAN    PÉREZ       NaN         ESP

789.xml    PEDRO   CASTRO     07-07-2007   ESP

列表的数据必须在同一列中。

我已经完成了这段代码,但是看起来不像我想要的表:

dictOfWords = { i : lista_archivos[i] for i in range(0, len(lista_archivos) ) }
d = dictOfWords
tabla = pd.DataFrame(dict([ (k,pd.Series(v)) for k,v in dictOfWords.items() ]))
tabla_final = tabla.transpose()
tabla_final

此外,我已经这样做了:

dictOfWords = { i : lista_archivos[i] for i in range(0, len(lista_archivos) ) }
print(dictOfWords)
tabla = pd.DataFrame.from_dict(dictOfWords, orient='index')
tabla

结果不好。

如果可能的话,我想要一个熊猫DataFrame和一个Spark DataFrame。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下情况适用于您的情况:

with cte(id,ord,test,concat_val) 
  as (select id,ord,test,test as concat_val
       from temp_test
       where ord=1
      union all
      select a.id,a.ord,a.test,b.concat_val||'_'||a.test
        from temp_test a
        join cte b
          on a.id=b.id
         and a.ord=b.ord+1 
      )
select * from cte order by id,ord

基本上,您将子列表转换为In [5]: lista_archivos = [[['FILE','123.xml'],['NAME','ANA'],['SURNAME','LÓPEZ'], ...: ['BIRTHDATE','05-05-2000'],['NATIONALITY','ESP']], [['FILE','458.xml'], ...: ['NAME','JUAN'],['SURNAME','PÉREZ'],['NATIONALITY','ESP']], [['FILE','789.xml'], ...: ['NAME','PEDRO'],['SURNAME','CASTRO'],['BIRTHDATE','07-07-2007'],['NATIONALITY','ESP']]] In [6]: pd.DataFrame(list(map(dict, lista_archivos))) Out[6]: BIRTHDATE FILE NAME NATIONALITY SURNAME 0 05-05-2000 123.xml ANA ESP LÓPEZ 1 NaN 458.xml JUAN ESP PÉREZ 2 07-07-2007 789.xml PEDRO ESP CASTRO 对象,并将这些列表提供给数据框架构造函数。数据框构造函数非常自然地使用字典列表。