我想基于数据列之间的可配置差异来合并数据列中的多列?
给出数据框:
1 3 6 7 10
1 a
3 b f
4 c
6 d
8 e
如果range_pixel = 1 输出将合并为=
1 3 6 10
1 a
3 b f
4 c
6 d
8 e
在标题[1,3,6,7,10]中: 只有6,7的差异<= range_pixel(为1) 因此将它们合并并替换为6,然后删除了7。
如果range = 3,则应合并所有列,因为所有列之间都存在差异<= range,以下代码可以做到,但是一定的范围适用于range = 2
我希望有人为此提供更好的方法。
#creating DF
top = [1, 3, 6, 7, 1, 10]
left = [1, 3, 4, 6, 8, 3]
text = ['a', 'b', 'c', 'd', 'e', 'f']
new_line_match = dict()
for i in range(len(top)):
top_val = int(top[i])
left_val = int(left[i])
text_val = text[i]
if int(top_val) in new_line_match.keys():
val = new_line_match.get(int(top_val))
val.update({int(left_val): text_val})
new_line_match.update({int(top_val): val})
else:
val = {int(left_val): text_val}
new_line_match.update({int(top_val): val})
df=pd.DataFrame(new_line_match)
df.fillna("",inplace=True)
#custom length variable
range_pixel=2
#logic starts from here
list_cols=sorted(list(df.columns))
df_cols=pd.DataFrame(list_cols)
mask1=(df_cols[0].diff()<=range_pixel)
df_cols["b"]=(mask1|mask1.shift(-1).fillna(False))+0
df_cols["groups"]=df_cols["b"].diff().ne(0).cumsum()
column_list=list(df_cols[df_cols["b"]==1].groupby("groups")
[0].apply(lambda x:list(x)))
for x in column_list:
df[x[0]]=df[x].apply(lambda x: ''.join(x), axis=1)
df.drop(x[1:],axis=1,inplace=True)
print(df)
预期输出:
1 6 10
1 a
3 b f
4 c
6 d
8 e
当前输出:
1 10
1 a
3 b f
4 c
6 d
8 e