要合并同一数据帧中其索引差异在指定范围内的列吗?

2024-03-29 11:14:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在dataframe中基于它们之间可配置的差异来合并多个列

给定数据帧:

        1   3   6   7   10
   1    a               
   3        b           f
   4            c       
   6                d   
   8    e               

如果范围\像素=1 输出将合并为=

        1   3   6   10
   1    a               
   3        b       f
   4            c       
   6            d   
   8    e   

在标题[1,3,6,7,10]中: 只有6,7有差别<;=范围×像素(1) 因此,他们被合并并替换为6和7被删除

如果range=3,则应合并所有列,因为所有列之间都有差异<;=以下代码不起作用的范围=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

Tags: textindfnewtopmatchlineupdate