在我的数据框中,有一种数据类型,如下所示:
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
我已经通过遍历所有行来获得输出,这在时间上变得非常痛苦,因为数据帧中有绝大多数行。也欢迎采用其他任何方法进行解决,我非常乐于寻求帮助和解决方案。
答案 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