我是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?请帮助我。
答案 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