我有一个类似的数据框
id col1 col2 col3 ......col25
1 a b c d ...........
2 d e f NA ........
3 a NA NA NA .......
我想要的是:
id start end
1 a b
1 b c
1 c d
2 d e
2 e f
for names, row in data_final.iterrows():
for i in range(0,26):
try:
x = pd.Series([row["id"],row[i], row[i+1]],index=['id', 'start','end'])
df1 = df1.append(x, ignore_index = True)
except:
break
这可行,但绝对不是最佳解决方案,因为它的时间复杂度太高。 我需要一个更好,更有效的解决方案。
答案 0 :(得分:1)
一种方法可能是stack
删除缺失值,groupby
和zip
将每个元素与后一个元素聚合在一起。我们只需要使用itertools.chain
将结果展平并创建一个数据框:
from itertools import chain
l = [list(zip(v.values[:-1], v.values[1:])) for _,v in df.stack().groupby(level=0)]
pd.DataFrame(chain.from_iterable(l), columns=['start', 'end'])
start end
0 a b
1 b c
2 c d
3 d e
4 e f