根据熊猫数据框中的字符串搜索将值分配给列表?

时间:2019-06-17 19:03:44

标签: python pandas

我有一个包含多列的数据框(“框架”)。在第2列('col2')中,我希望它搜索一组字符('42')(包括空格),然后在第1列('col1')中搜索'ID'。然后,我在第6列和第7列中有要分配给列表的值('col6','col7')(但我们将其称为“ vals42”),但只有从我们找到的位置“ 42”开始的索引中的值直到找到“ ID”的索引。然后,我希望它重新开始,并寻找下一个“ 42”,依此类推。

另一个棘手的部分是,第一个“ ID”实际上在第一个“ 42”之前,因此我需要它从第二个“ ID”开始,因此我没有无效的范围。

另一件事,我的数据框中存在一堆NaN。

我正在尝试通过获取“ 42”的索引和“ ID”的索引,然后创建熊猫数据框的子集,然后继续进行下一个“ 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文件制成pandas数据框。下面是数据框一般格式的示例: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输出的数据与“ ID”或“ 67812 LT 42 01”不同。 x'd数据是它自己的整个唯一事物。每个x'd单元格中都有其自己唯一的字符集,因此不会与“ 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

0 个答案:

没有答案
相关问题