基于数据帧中的字符串搜索为列表赋值?

2024-10-01 11:39:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe('frame'),它有多个列。在第2列('col2')中,我希望它搜索一组字符('42')(包括空格),然后在第1列('col1')中搜索'ID'。然后,在第6列和第7列(“col6”,“col7”)中有一些值,我想将这些值赋给一个列表(我们称之为“vals42”),但只有从找到“42”的索引到找到“ID”的索引的值。然后我想重新开始,寻找下一个'42'等等。你知道吗

另一个棘手的部分是,第一个'ID'实际上在第一个'42'之前,所以我需要它从第二个'ID'开始,这样我就不会有一个无效的范围。你知道吗

另一件事,我的数据帧中有一堆NaN。你知道吗

我试图通过获取'42'的索引和'ID'的索引,然后创建pandas数据帧的一个子集,然后当它转到下一个'42'时,它会创建另一个子集,依此类推。你知道吗

在我以前的一些代码中,我已经知道如何将“col6”和“col7”中的值放入一个列表中。我正在努力(我想)的是得到逻辑来检查这些字符并得到它们的索引。你知道吗

for var in frame:
    if (frame['col2'].str.contains(' 42 ')) == True:
        begin = frame.index.get_loc(frame.name)
    elif (frame['col1'].str.contains('ID')) == True:
        end = frame.index.get_loc(frame.name)
        subset = frame[begin:end]
        for column in subset[['col6','col7']]:
             ColumnContents = pd.concat([subset['col6'], subset['col7']])
             ColumnContents = pd.to_numeric(ColumnContents, errors = 'coerce')
             vals42 = ColumnContents[ColumnContents.apply(lambda x: x > 0 and x < 20)]

熊猫数据框是通过从我拥有的文件夹中读取csv Excel文件来制作的。下面是数据帧的一般格式的一个例子:x表示不重要的数据。你知道吗

      col1       col2          .  .  .   col6      col7 
0      ID        xxx                     NaN       NaN
1      xxx     67812 LT 42 01
2      xxx       xxx                     NaN       NaN
3      xxx       xxx                     NaN       NaN
4      xxx       xxx                     NaN       NaN
.
.
.
17    xxx        xxx                     0.543     1670
18    xxx        xxx                     0.321     8954
.
.
.
29    ID         xxx                      NaN      NaN
30    xxx        12976 42 01

所以在这个例子中,我要赋值的值从索引17开始,一直到索引28。不过,在索引29中,我们得到了一个新的“ID”,所以它重新开始。列6和列7中存在值的行数不一定总是相同的。另外,数字并不总是'42',它可能是其他的东西,但一旦我得到一个数字,我可以把它应用到其他人,所以我用'42'作为一个例子。理想情况下,如果满足条件(x>;0,x<;20),我希望将“col6”和“col7”中的数字指定给列表。你知道吗

编辑:“ID”字面上就是“ID”。每个实例中都没有与之关联的特殊字符串,因此第0行和第29行中的“ID”完全相同。x'd out数据与'ID'或'67812 LT 42 01'不同。x'd out数据是它自己独特的东西。每个x'd out单元格都有自己独特的字符集,因此它与“ID”或“67812 LT 42 01”不匹配。你知道吗

所以问题是,我知道下面四行代码在我的另一个场景中工作,我只是从整个数据帧中获取值。你知道吗

当我运行这个时,我得到了一个错误“序列的真值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all()

编辑/解决方案:

如果有人对未来的参考很好奇的话,我已经想好了:

start = True
vals42 = pd.Series()
for index2, rows  in frame[1:].iterrows():
      if (' 42 ' in rows['col2']):
           begin = index2
           start = True
      elif (start == True) & ('ID' in rows['col1']):
           end = index2
           subset = frame[begin:end]
           for column in subset[['col6','col7']]:
                ColumnContents = pd.concat([subset['col6'], subset['col7']])
                ColumnContents = pd.to_numeric(ColumnContents, errors = 'coerce')
                subsetTotal = ColumnContents[ColumnContents.apply(lambda x: x > 0 and x < 20)]
                vals42 = pd.concat([vals42, subsetTotal])
                start = False

Tags: 数据inidtruenanframecol2col1