![](/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.