【发布时间】:2018-02-11 21:57:17
【问题描述】:
我曾经使用 SAS 清理数据,但我想改用 Python。
我有一个大型数据集,该数据集是从一些文件 (html) 中删除的,但包含一些嘈杂的信息,我想删除这些不相关的数据。
基本上,我需要在条件为 True 的行之后删除某些数据行(但是,这可能是一个列表,多个 True/或根本没有 True;如果有 True,我想确定最后一个一)。
原始数据:
<table>
<tr>
<td>Report_ID</td>
<td>Table_ID</td>
<td>Group_ID</td>
<td>Item_ID</td>
<td>Flag_old</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item1</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item2</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item3</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item4</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item5</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item1</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item2</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item3</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item4</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item1</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item2</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item3</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item4</td>
<td>0</td>
</tr>
</table>
预期数据:
<table>
<tr>
<td>Report_ID</td>
<td>Table_ID</td>
<td>Group_ID</td>
<td>Item_ID</td>
<td>Flag_old</td>
<td>Flag_new</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item2</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item3</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item4</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>1</td>
<td>item5</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item2</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item3</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>2</td>
<td>item4</td>
<td>0</td>
<td>1</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item1</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item2</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item3</td>
<td>0</td>
<td>0</td>
</tr>
<tr>
<td>A</td>
<td>1</td>
<td>3</td>
<td>item4</td>
<td>0</td>
<td>0</td>
</tr>
</table>
从上面可以看出,我想用条件 Flag_old == 1 识别行下方的行。
鉴于数据的结构,我首先使用 groupby 来分割我的整个数据框,我正在考虑定义一个函数来选择行并将该函数应用于数据框 groupby 对象,然后当然为指示这些噪声数据行的整个数据框。
def lastline(series):
return max(series[series.values == 1].index)
df['lastline'] = df.groupby('id').apply(lastline(df['flag']))
但我收到了'int' object is not callable 错误。
您能否建议我如何正确执行此操作?这几天我一直在为此苦苦挣扎……非常感谢。
【问题讨论】:
-
您是否在脚本
lastline或max的其他位置调用了变量?很难知道,没有Minimal, Complete, and Verifiable example 会发生什么 -
分享您的数据样本和预期输出
-
@AndreyF,谢谢两位,我会生成一个示例数据。
-
@Piinthesky,不,我没有给他们打电话。我会在一分钟内生成一个样本数据,这样你们就会看到我想用我的数据做什么。再次感谢。
-
@AndreyF 在这种情况下,我只得到 flag_old == 1 的行,对吗?但我想确定下面的行...