繁体   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