我有一个包含多列的数据框(“框架”)。在第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