使用字典将列表转换为数据框

时间:2019-03-02 07:03:41

标签: python loops dataframe dictionary iterator

我是Pythonland的新手,我有一个问题。我有一个如下列表,希望将其转换为数据框。

我在Stackoverflow上读到,最好先创建一本字典,然后再创建一个列表,所以我如下创建一个字典。

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries

row_names = ["jack", "mick", "nick","pick"]

data = ['100','50','A','107','62','B'] # The actual list has 1640 entries

dic = {key:[] for key in column_names}
dic['name'] = row_names
t = 0
while t< len(data):
    dic['height'].append(data[t])
    t = t+3
t = 1
while t< len(data):
    dic['weight'].append(data[t])
    t = t+3

依此类推,我有10列,因此我写了10次以上代码以完成完整的词典。然后我转换 它到数据帧。它工作得很好,必须 可以用更短的方式做到这一点。我不知道如何用数字来指代字典的键。它应该包装到一个函数。另外,如何在执行下一个循环之前自动将t值加1?请帮助我。

5 个答案:

答案 0 :(得分:0)

您可以像这样遍历columnn_names

dic = {key:[] for key in column_names}
dic['name'] = row_names
for t, column_name in enumerate(column_names):
    i = t
    while i< len(data):
        dic[column_name].append(data[i])
        i += 3

枚举将自动从t的0形式迭代到len(column_names)-1

答案 1 :(得分:0)

i = 0
while True:
    try:
        for j in column_names:
            d[j].append(data[i])
            i += 1

    except Exception as er:  #So when i value exceed by data list it comes to exception and it will break the loop as well
        print(er, "################")
        break

答案 2 :(得分:0)

第一个问题是您将所有列数据都链接到一个列表中。您首先应该研究如何防止它,并在每个列表中都包含一个列表值,其中每个列值都位于单独的列表中,例如[['100', '107'], ['50', '62'], ['A', 'B']]。您需要此数据结构以有效进行处理的任何方式:

cl_count = len(column_names)
d_count = len(data)
spl_data = [[data[j] for j in range(i, d_count, cl_count)] for i in range(cl_count)] 

然后,您应该使用dict理解。 这是3.x Python功能,因此在Py 2.x中将无法使用。

df = pd.DataFrame({j: spl_data[i] for i, j in enumerate(column_names)})

答案 3 :(得分:0)

首先,我们应该了解数据框的理想字典的外观。

可以通过两种不同的方式来考虑数据框:
一种是传统的行集合。

'row 0':  ['jack', 100, 50, 'A'],
'row 1':  ['mick', 107, 62, 'B']

但是,还有第二种表示更有用,尽管起初可能不那么直观。
列的集合:

'name': ['jack', 'mick'],
'height': ['100', '107'],
'weight': ['50', '62'],
'grade': ['A', 'B']

现在,这是要实现的关键,第二种表示更有用 因为那是数据帧之间相互支持和使用的表示形式。
它不会在单个分组中遇到数据类型冲突(每列需要具有1个固定数据类型) 但是,在整个行表示中,数据类型可能会有所不同。
而且,可以轻松,一致地在整个色谱柱上执行操作 由于这种一致性,无法连续保证。

因此, tl; dr 数据帧实质上是等长列的集合。

因此,该表示形式的字典可以轻松转换为DataFrame。

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries

row_names = ["jack", "mick"]

data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

因此,牢记这一点,首先要意识到的是,按照目前的格式, data是一个非常差的表示形式。 它是合并到单个列表中的行的集合。

如果您是控制数据形成方式的人,那么要做的第一件事就是不要以这种方式进行准备。

目标是每个列的列表,理想情况下,以该格式准备列表。

但是,如果现在以这种格式给出,则需要迭代并相应地收集值。这是一种方法

column_names = ["name", "height" , "weight", "grade"] # Actual list has 10 entries
row_names = ["jack", "mick"]
data = [100, 50,'A', 107, 62,'B'] # The actual list has 1640 entries

dic = {key:[] for key in column_names}
dic['name'] = row_names
print(dic)

到目前为止的输出:

{'height': [],
 'weight': [],
 'grade': [],
 'name': ['jack', 'mick']} #so, now, names are a column representation with all correct values.

remaining_cols = column_names[1:]

#Explanations for the following part given at the end
data_it = iter(data)
for row in zip(*([data_it] * len(remaining_cols))):
    for i, val in enumerate(row):
        dic[remaining_cols[i]].append(val)

print(dic)

输出:

{'name': ['jack', 'mick'],
 'height': [100, 107],
 'weight': [50, 62],
 'grade': ['A', 'B']}

我们已经完成了表示法

最后:

import pd
df = pd.DataFrame(dic, columns = column_names)
print(df)
   name  height  weight grade
0  jack     100      50     A
1  mick     107      62     B

编辑: zip部分的一些解释: zip接受任何迭代,并允许我们一起迭代遍历它们。

data_it = iter(data) #prepares an iterator. 

[data_it] * len(remaining_cols) #creates references to the same iterator

在这里,这类似于[data_it, data_it, data_it]

*中的*[data_it, data_it, data_it]允许我们将列表解压缩为zip函数的3个参数 因此,对于任何函数f,f(*[data_it, data_it, data_it])都等效于f(data_it, data_it, data_it)

这里的神奇之处在于,遍历迭代器/推进迭代器现在将反映所有引用中的更改

将所有内容放在一起: zip(*([data_it] * len(remaining_cols)))实际上将允许我们一次从数据中提取3项,并将其分配给行 因此,row = (100, 50, 'A')在zip的第一次迭代中

for i, val in enumerate(row): #just iterate through the row, keeping index too using enumerate
    dic[remaining_cols[i]].append(val) #use indexes to access the correct list in the dictionary

希望有帮助。

答案 4 :(得分:0)

如果您按照l159的建议使用Python 3.x,则可以使用理解字典,然后使用其名称作为行索引来创建Pandas DataFrame:

data = ['100', '50', 'A', '107', '62', 'B', '103', '64', 'C', '105', '78', 'D']
column_names = ["height", "weight", "grade"]
row_names = ["jack", "mick", "nick", "pick"]

df = pd.DataFrame.from_dict(
    {
        row_label: {
            column_label: data[i * len(column_names) + j]
            for j, column_label in enumerate(column_names)
        } for i, row_label in enumerate(row_names)
    },
    orient='index'
)

实际上,中间字典是嵌套字典:外部字典的键是行标签(在这种情况下,是row_names列表的项);与每个键关联的值是一个字典,其键是列标签(即column_names中的项),值是data列表中的对应元素。

函数from_dict用于创建DataFrame实例。

因此,前面的代码产生以下结果:

     height weight grade
jack    100     50     A
mick    107     62     B
nick    103     64     C
pick    105     78     D