Python替代了lowerr函数来切片行

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

我有一个基于模条件切片行的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_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