簡體   English   中英

如何獲取列表並填充值並放入數據框並在 Python 中過濾?

[英]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構造函數的一種方便的數據結構是一個列表列表,其中每個列表都是一行。 所以你需要迭代你的值,當你遇到一個文件名時,將它保存在一個變量中,並將它用作每個列表的第一項。 制作一個列表並附加到它; 如果您遇到以abuo np.nan內容,請檢查列表長度並在適當時使用np.nan填充它; 列表已滿時,將其附加到主列表中,然后創建一個新的列表。

  • 制作一個空的列表
  • 創建一個空的列表
  • 創建一個空的文件名占位符 - fname ?
  • 開始迭代
  • 如果項目是文件名
    • 占第一個文件名
    • 如果是空項目追加,分配項目fname
    • 如果 item 不同於fname
      • 長度6,附加,做一個新的
      • 將項目附加到
      • 將項目分配給fname
  • 如果它以'ab''uo'開頭

    • 如果長度sub < 2 附加到sub
    • 如果長度是> = 2,填充長度6和附加,使新的
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM