要合并同一数据帧中指定索引差的列范围?

时间:2019-07-10 11:25:03

标签: python pandas dataframe series

我想基于数据列之间的可配置差异来合并数据列中的多列?

给出数据框:

        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

0 个答案:

没有答案