在数据框行之间进行比较以进行删除

时间:2019-11-14 18:08:00

标签: python pandas dataframe

在我的数据框中,有一种数据类型,如下所示:

product_no    part_no    level
1              1_1         1
1              1_2         1
1              1_3         2
1              1_4         1
1              1_5         1
1              1_6         2
1              1_7         1
2              2_1         1
2              2_2         1
3              3_1         2

我想进行这样的比较:如果两个连续的行的级别为“ 1”,则将删除上一行。为了更好地理解,我打算进行转换之后,输出应如下所示:

product_no    part_no    level
1              1_2         1
1              1_3         2
1              1_5         1
1              1_6         2
2              2_2         1
3              3_1         2

我已经通过遍历所有行来获得输出,这在时间上变得非常痛苦,因为数据帧中有绝大多数行。也欢迎采用其他任何方法进行解决,我非常乐于寻求帮助和解决方案。

2 个答案:

答案 0 :(得分:3)

编辑:@ALollz回答后,它使我记得了熊猫array = [] for row in range(height): array.append([0 for column in range (width)]) 函数,因此您可以从DataFrame中完成所有操作。如果您考虑使用列而不是行,Pandas的工作速度会更快。

.shift()

最后,删除重复项的代码

## Create Dummy data and dataframe
level=[1, 1, 2, 1, 1, 1, 2]
part_no=['1_1', '1_2', '1_3', '2_1', "2_2","2_3", "3_1"]
product_no=[1, 1, 1, 2, 2, 2, 3]

df = pd.DataFrame([product_no, part_no, level]).transpose()
df.columns = ['product_no', 'part_no', 'level']

答案 1 :(得分:1)

使用ne + shift + cumsum创建连续值组。这仅考虑'level'列。

s = df['level'].ne(df['level'].shift()).cumsum()

如果仅考虑为level==1的连续组删除重复项,可以通过确保1以外的任何级别的每一行都是其自己的组来解决。

s = (df['level'].ne(df['level'].shift()) | df.level.ne(1)).cumsum()

要仅保留组中的最后一行,请使用以下任意一项:

df.groupby(s).tail(1)

df.loc[~s.duplicated(keep='last')]

# Excessive and verbose, but straightforward. 
df.assign(s=s).drop_duplicates('s', keep='last').drop(columns='s')

   product_no part_no  level
1           1     1_2      1
2           1     1_3      2
4           1     1_5      1
5           1     1_6      2
8           2     2_2      1
9           3     3_1      2