Python 将嵌套列表转换为具有列名的数据帧
我有一个嵌套列表,看起来像这样Python 将嵌套列表转换为具有列名的数据帧,python,pandas,data-processing,Python,Pandas,Data Processing,我有一个嵌套列表,看起来像这样 features = [['0:0.084556', '1:0.138594', '2:0.094304\n'], ['0:0.101468', '4:0.138594', '5:0.377215\n'], ['0:0.135290', '2:0.277187', '3:0.141456\n'] ] 嵌套列表中的每个列表都是以逗号分隔的行。“:”的左侧是列名,右侧是行值 我想将其转换为熊猫数据帧,如下所示: f_0000 | f_0001 |
features =
[['0:0.084556', '1:0.138594', '2:0.094304\n'],
['0:0.101468', '4:0.138594', '5:0.377215\n'],
['0:0.135290', '2:0.277187', '3:0.141456\n']
]
嵌套列表中的每个列表都是以逗号分隔的行。“:”的左侧是列名,右侧是行值
我想将其转换为熊猫数据帧,如下所示:
f_0000 | f_0001 | f_0002 | f_0003 | f_0004 | f_0005
---------------------------------------------------------------
0.084556 | 0.138594 | 0.094304 | 0.000000 | 0.000000 | 0.000000
0.101468 | 0.000000 | 0.000000 | 0.000000 | 0.138594 | 0.377215
0.135290 | 0.000000 | 0.277187 | 0.141456 | 0.000000 | 0.000000
有人能帮我解决这个问题吗
原始DF(它在pd.read_剪贴板上的格式不正确,但是…)
试试这个:
df = pd.DataFrame(data, columns = ['Column name 1'], ['column name 2'])
我认为对于循环,简单的方法仍然是
首先,从给定的功能中选择所有键
对于所有元素,我们使用并提取第一个元素李>
然后,因为我们只需要唯一的密钥,所以我们使用。然后,我们将其转换回列表
,并使用排序
对键进行排序(如果需要,可以提供一些详细信息)李>
第一部分总结如下:
keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
从上述键创建一个空的dict
,并用空列表初始化所有键:
迭代所有功能:
将访问的所有关键功能保存在seen
变量中
添加所有功能键和值
使用不在当前功能中的键完成数据
最后,使用默认构造函数[pd.dataframe()
])从out dict创建数据帧
使用名称和字符串格式()正确设置列的格式。有一些很好的解释
说得够多了,这里是完整的代码+插图:
features = [["0:0.084556", "1:0.138594", "2:0.094304"],
["0:0.101468", "4:0.138594", "5:0.377215"],
["0:0.135290", "2:0.277187", "3:0.141456"]
]
# Step 1
keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
print(keys)
# ['0', '1', '2', '3', '4', '5']
# Step 2
data = {k:[] for k in keys}
print(data)
# {'0': [], '1': [], '2': [], '3': [], '4': [], '5': []}
# Step 3
for sub in features:
# Step 3.1
seen = []
# Step 3.2
for l in sub:
k2, v = l.split(":") # Get key and value
data[k2].append(float(v)) # Append current value to data
seen.append(k2) # Set the key as seen
# Step 3.3
for k in keys: # For all data keys
if k not in seen: # If not seen
data[k].append(0) # Add 0
print(data)
# {'0': [0.084556, 0.101468, 0.13529],
# '1': [0.138594, 0, 0],
# '2': [0.094304, 0,0.277187],
# '3': [0, 0, 0.141456],
# '4': [0, 0.138594, 0],
# '5': [0, 0.377215, 0]
# }
# Step 4
df = pd.DataFrame(data)
print(df)
# 0 1 2 3 4 5
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000
# Step 5
df.columns = ["f_{:04d}".format(int(val)) for val in df.columns]
print(df)
# f_0000 f_0001 f_0002 f_0003 f_0004 f_0005
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000
这些字符串在列表中吗?或者这是文本文件中的某个“列表”?这最初是一个数据框,列表中的所有项目都作为一列。我做了list(train['features'].str.split(“”))
将其转换为嵌套列表。features=[[0:0.08456,1:0.138594,2:0.094304\n],[0:0.101468,4:0.138594,5:0.377215\n],[0:0.135290,2:0.277187,3:0.141456\n]]这不是一个正确的列表。您能发送实际的列表吗?@SachinGupta对此表示歉意。您能添加原始数据帧的样本吗?从那里开始可能会更快。做得好,非常干净的方法!我试图做一些类似的事情,但我的python技能再次让我失望!这太棒了!如果我有一个数字列,比如“f_1000”,这些列将不再有序,不是吗?你怎么会这么想?如果我有5000个特征,则在步骤1中对列进行排序。列f_0000将首先是f_0001,然后是f_0010。应该是f_0000列,然后是f_0001列,然后是f_0002列。不过,我大概能理解这一部分。谢谢伟大的另一种方法是转换为数字,排序,然后返回字符串(如果需要的话):-)请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票。
data = {k:[] for k in keys}
features = [["0:0.084556", "1:0.138594", "2:0.094304"],
["0:0.101468", "4:0.138594", "5:0.377215"],
["0:0.135290", "2:0.277187", "3:0.141456"]
]
# Step 1
keys = sorted(list(set([elt.split(':')[0] for l in features for elt in l])))
print(keys)
# ['0', '1', '2', '3', '4', '5']
# Step 2
data = {k:[] for k in keys}
print(data)
# {'0': [], '1': [], '2': [], '3': [], '4': [], '5': []}
# Step 3
for sub in features:
# Step 3.1
seen = []
# Step 3.2
for l in sub:
k2, v = l.split(":") # Get key and value
data[k2].append(float(v)) # Append current value to data
seen.append(k2) # Set the key as seen
# Step 3.3
for k in keys: # For all data keys
if k not in seen: # If not seen
data[k].append(0) # Add 0
print(data)
# {'0': [0.084556, 0.101468, 0.13529],
# '1': [0.138594, 0, 0],
# '2': [0.094304, 0,0.277187],
# '3': [0, 0, 0.141456],
# '4': [0, 0.138594, 0],
# '5': [0, 0.377215, 0]
# }
# Step 4
df = pd.DataFrame(data)
print(df)
# 0 1 2 3 4 5
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000
# Step 5
df.columns = ["f_{:04d}".format(int(val)) for val in df.columns]
print(df)
# f_0000 f_0001 f_0002 f_0003 f_0004 f_0005
# 0 0.084556 0.138594 0.094304 0.000000 0.000000 0.000000
# 1 0.101468 0.000000 0.000000 0.000000 0.138594 0.377215
# 2 0.135290 0.000000 0.277187 0.141456 0.000000 0.000000