gpt4 book ai didi

python pandas groupby 识别行

转载 作者:行者123 更新时间:2023-11-28 18:15:20 25 4
gpt4 key购买 nike

我以前使用 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 错误。

你能告诉我如何正确地做到这一点吗?我已经为此苦苦挣扎了几天...非常感谢。

最佳答案

我认为您需要使用 transform 自定义函数返回新列:

def f(x):
#get cumulative sum, shift
a = x.cumsum().shift()
#check max value of cumsumed a and chain condition for remove 0 only groups
#convert Trues to 1 by astype
return ((a == a.max()) & (a != 0)).astype(int)

df['Flag_new'] = df.groupby('Group_ID')['Flag_old'].transform(f)
print (df)
Report_ID Table_ID Group_ID Item_ID Flag_old Flag_new
0 A 1 1 item1 0 0
1 A 1 1 item2 0 0
2 A 1 1 item3 1 0
3 A 1 1 item4 0 1
4 A 1 1 item5 0 1
5 A 1 2 item1 1 0
6 A 1 2 item2 0 0
7 A 1 2 item3 1 0
8 A 1 2 item4 0 1
9 A 1 3 item1 0 0
10 A 1 3 item2 0 0
11 A 1 3 item3 0 0
12 A 1 3 item4 0 0

关于python pandas groupby 识别行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48731027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com