![](/img/trans.png)
[英]How to extract values from a list in Python and put into a dataframe
[英]How to take a list and fill with values and put into a dataframe and filter in Python?
我有一个列表,它有一个文件名,每个文件都有多个值。 我想将数据放入数据框和过滤器中。所以有 4 个文件和值。每个文件应该有 5 个值,以 'ab ..' 或 'uo ..' 开头。但是有些缺失值不是就像在文件一中 'ab +1','co(0)','uo +2.5'.. 其中 'ab +1','co(0)' 缺少 3 个附加值。 我希望排除这些或用 0 填充值。
values = [
'file1','ab +5','co(0)','+107','+108','95%','ab +1','co(0)','uo +2.5','co(0)','+107','+107','90%','uo +2.5','co(0)','+107','+110','90%',
'file2','ab +0.5','co(1)','ab +2.5','co(0)','+106','+102','95%','ab +2.5','co(0)','ab +8.0','co(1)','ab +2.5','co(0)','-106','+102','95%','uo +2.5','co(0)','+107','+107','90%',
'file3','ab +3','co(0)','+107','+108','85%','co(0)','ab +4','co(0)','+107','+118','95%','uo +12.5','co(0)','+106','+107','90%',
'file4','ab +3','co(0)','+107','+108','95%','uo +12.5','co(0)','+106','+107','90%'
]
wanted df results:
0 1 2 3 4 5
0 file1 ab +1 co(0) +107 +108 95%
1 file1 ab +1 co(0) nan nan nan
2 file1 uo +2.5 co(0) +107 +107 90%
3 file1 uo +2.5 co(0) +107 +110 90%
4 file2 ab +0.5 co(1) nan nan nan
5 file2 ab +2.5 co(0) +106 +102 95%
6 file2 ab +2.5 co(0) nan nan nan
7 file2 ab +8.0 co(1) nan nan nan
8 file2 ab +2.5 co(0) -106 +102 95%
9 file2 uo +2.5 co(0) +107 +107 90%
10 file3 ab +3 co(0) +107 +108 85%
11 file3 ab +4 co(0) +107 +118 95%
12 file3 uo +12.5co(0) +106 +107 90%
13 file4 ab +3 co(0) +107 +108 95%
14 file4 uo +12.5co(0) +106 +107 90%
提供给 DataFrame构造函数的一种方便的数据结构是一个列表列表,其中每个子列表都是一行。 所以你需要迭代你的值,当你遇到一个文件名时,将它保存在一个变量中,并将它用作每个子列表的第一项。 制作一个子列表并附加到它; 如果您遇到以ab
或uo
np.nan
内容,请检查子列表长度并在适当时使用np.nan
填充它; 当子列表已满时,将其附加到主列表中,然后创建一个新的子列表。
fname
?fname
fname
fname
如果它以'ab'
或'uo'
开头
将main馈送到 DataFrame
这是一种 hacky 方法,它动态创建字典,然后使用具有索引方向的from_dict来生成数据帧。 缺失值(来自最长的文件列表)将没有。
values = [
'file1','ab +5','co(0)','+107','+108','95%','ab +1','co(0)','uo +2.5','co(0)','+107','+107','90%','uo +2.5','co(0)','+107','+110','90%',
'file2','ab +0.5','co(1)','ab +2.5','co(0)','+106','+102','95%','ab +2.5','co(0)','ab +8.0','co(1)','ab +2.5','co(0)','-106','+102','95%','uo +2.5','co(0)','+107','+107','90%',
'file3','ab +3','co(0)','+107','+108','85%','co(0)','ab +4','co(0)','+107','+118','95%','uo +12.5','co(0)','+106','+107','90%',
'file4','ab +3','co(0)','+107','+108','95%','uo +12.5','co(0)','+106','+107','90%'
]
i = 0
value_dict = {}
for j in values:
if "file" in j:
i += 1
value_dict[i] = []
value_dict[i].append(j)
print(value_dict)
import pandas as pd
df = pd.DataFrame.from_dict(value_dict, orient="index")
df = df.reset_index() # to get what you wanted in the question
print(df)
这是你想到的吗?
这是使用列表列表的实现(现在实现有点来自二战的伪代码):
import pandas as pd
#Initial data
values = [
'file1','ab +5','co(0)','+107','+108','95%','ab +1','co(0)','uo +2.5','co(0)','+107','+107','90%','uo +2.5','co(0)','+107','+110','90%',
'file2','ab +0.5','co(1)','ab +2.5','co(0)','+106','+102','95%','ab +2.5','co(0)','ab +8.0','co(1)','ab +2.5','co(0)','-106','+102','95%','uo +2.5','co(0)','+107','+107','90%',
'file3','ab +3','co(0)','+107','+108','85%','ab +4','co(0)','+107','+118','95%','uo +12.5','co(0)','+106','+107','90%',
'file4','ab +3','co(0)','+107','+108','95%','uo +12.5','co(0)','+106','+107','90%'
]
data = []
newRow = []
for val in values:
#Case 1: New file name
if 'file' in val:
currVal = val
#Case 2: Case 'ab' or 'uo'
elif ('ab' in val) or ('uo' in val):
while len(newRow) < 6: #length of each row
newRow.append(0)
data.append(newRow) #Appending a new row
newRow = [currVal, val]
#Case 3: All other data
else:
newRow.append(val)
#Configuring final details and converting to a dataframe
data.pop(0)
data.append(newRow)
df = pd.DataFrame(data)
print(df)
输出:
0 1 2 3 4 5
0 file1 ab +5 co(0) +107 +108 95%
1 file1 ab +1 co(0) 0 0 0
2 file1 uo +2.5 co(0) +107 +107 90%
3 file1 uo +2.5 co(0) +107 +110 90%
4 file2 ab +0.5 co(1) 0 0 0
5 file2 ab +2.5 co(0) +106 +102 95%
6 file2 ab +2.5 co(0) 0 0 0
7 file2 ab +8.0 co(1) 0 0 0
8 file2 ab +2.5 co(0) -106 +102 95%
9 file2 uo +2.5 co(0) +107 +107 90%
10 file3 ab +3 co(0) +107 +108 85%
11 file3 ab +4 co(0) +107 +118 95%
12 file3 uo +12.5 co(0) +106 +107 90%
13 file4 ab +3 co(0) +107 +108 95%
14 file4 uo +12.5 co(0) +106 +107 90%
根据给定的输出, values
在索引 = 46 处包含错误。 我已将其从我的values
数据集中删除。
所有文件名都将包含“文件”一词。 如果这是不可取的,我建议收集您的文件名列表并检查 val 是否包含在您的列表中。 例如
if val in list_of_files: ...
缺失的值将以 0 顺序出现。 因此,如果行中缺少 col 3 而 col 4 不存在,则代码将不会读取它(相反,col 3 将在值中包含 col 4 数据,但 col 4 不会在数据帧中)。 如果这不是所希望的,那么您可能会要求更具体/更难的问题。
第 1 列中总会有“ab”或“ou”。不能丢失。 如果有人计划改变这一点,问题就不能一概而论。 (您的数据集中需要第二个一致的键。我在本例中选择了“ab”/“ou”。)
首先沿文件*值拆分原始字符串:
size=len(values)
idx_list = [idx + 1 for idx, val in
enumerate(values) if 'file' in val]
res = [values[i: j] for i, j in
zip([0] + idx_list, idx_list +
([size] if idx_list[-1] != size else []))]
一旦大列表被拆分,假设没有错误,完美文件:
#defining function to get list
def getDfList(sList,string,finalList):
i=0
for k in range(int(len(sList)/5)):
i=k*5
aLine=[string,sList[i],sList[i+1],sList[i+2],sList[i+3],sList[i+4]]
finalList.append(aLine)
return finalList
#calling function
makeDf=[]
makeDf=getDfList(res[1],res[0][-1],makeDf)
makeDf=getDfList(res[2],res[1][-1],makeDf)
makeDf=getDfList(res[3],res[2][-1],makeDf)
makeDf=getDfList(res[4],res[3][-1],makeDf)
最后一步是将列表转换为 dict 到 df
keys=['0','1','2','3','4','5']
df = pd.DataFrame(makeDf,columns = keys)
我曾经从 geek for geeks 学习 python
我也可以将 makeDf 部分放入一个函数中......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.