Python替代了lowerr函数来切片行
我有一个基于模条件切片行的R代码,我正试图在python中实现同样的功能 任何帮助都将不胜感激 R代码: 让我们试试groupby: 更新:另一种更详细但性能更好的方法,特别是在较大数据上:Python替代了lowerr函数来切片行,python,python-3.x,pandas,numpy,dataframe,Python,Python 3.x,Pandas,Numpy,Dataframe,我有一个基于模条件切片行的R代码,我正试图在python中实现同样的功能 任何帮助都将不胜感激 R代码: 让我们试试groupby: 更新:另一种更详细但性能更好的方法,特别是在较大数据上: # lazy groupby g = df.groupby('id')['id'] # number of rows in each group num_rows=g.transform('size') # threshold for each group thresh = np.where(num_r
# lazy groupby
g = df.groupby('id')['id']
# number of rows in each group
num_rows=g.transform('size')
# threshold for each group
thresh = np.where(num_rows%3==0, num_rows, num_rows-1)
# enumeration in each group
enum = g.cumcount()
df[enum<thresh]
让我们试试groupby:
更新:另一种更详细但性能更好的方法,特别是在较大数据上:
# lazy groupby
g = df.groupby('id')['id']
# number of rows in each group
num_rows=g.transform('size')
# threshold for each group
thresh = np.where(num_rows%3==0, num_rows, num_rows-1)
# enumeration in each group
enum = g.cumcount()
df[enum<thresh]
试图避免使用apply函数,因此这是冗长的: 下面的代码所做的是获取每个id分组的总行数,进行累积累积累积计数,并使用模数创建一个检查列。查询然后根据您的条件过滤出行,最后只保留原始数据帧的初始列
(df.assign(total=df.groupby("id").id.transform("count"),
row_number=df.groupby("id").cumcount(),
filter_check=lambda x: x.total % 3)
.query("total - row_number != filter_check")
.filter(df))
id a b
0 1 2 0
1 1 3 0
2 1 0 0
4 2 1 0
5 2 1 1
6 2 1 0
7 3 0 1
8 3 0 1
9 3 0 1
10 3 1 0
11 3 1 1
12 3 0 1
试图避免使用apply函数,因此这是冗长的: 下面的代码所做的是获取每个id分组的总行数,进行累积累积累积计数,并使用模数创建一个检查列。查询然后根据您的条件过滤出行,最后只保留原始数据帧的初始列
(df.assign(total=df.groupby("id").id.transform("count"),
row_number=df.groupby("id").cumcount(),
filter_check=lambda x: x.total % 3)
.query("total - row_number != filter_check")
.filter(df))
id a b
0 1 2 0
1 1 3 0
2 1 0 0
4 2 1 0
5 2 1 1
6 2 1 0
7 3 0 1
8 3 0 1
9 3 0 1
10 3 1 0
11 3 1 1
12 3 0 1
在中发布您的预期输出python@sammywemmy更新后的帖子。在中发布您的预期输出python@sammywemmy更新后的帖子。
id a b
0 1 2 0
1 1 3 0
2 1 0 0
4 2 1 0
5 2 1 1
6 2 1 0
7 3 0 1
8 3 0 1
9 3 0 1
10 3 1 0
11 3 1 1
12 3 0 1
(df.assign(total=df.groupby("id").id.transform("count"),
row_number=df.groupby("id").cumcount(),
filter_check=lambda x: x.total % 3)
.query("total - row_number != filter_check")
.filter(df))
id a b
0 1 2 0
1 1 3 0
2 1 0 0
4 2 1 0
5 2 1 1
6 2 1 0
7 3 0 1
8 3 0 1
9 3 0 1
10 3 1 0
11 3 1 1
12 3 0 1