我曾经使用SAS清洗数据,但现在想转用Python。
我有一个大型数据集,是从一些文件(html)中抓取的,但其中包含了一些噪音信息,我希望能够去除这些无关数据。
基本上,我需要在满足条件为True的行后删除某些数据行(但这可能是一个列表,有多个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>
鉴于数据结构,我首先使用groupby对整个dataframe进行分段,然后考虑定义一个函数来选择行并将函数应用于dataframe groupby对象,然后为整个dataframe创建一个新列以指示这些嘈杂数据的行。
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
吗?如果没有提供 最小完整可验证示例,很难知道发生了什么。 - Mr. T