【问题标题】:efficient solution for reshaping the dataframe in pandas在 Pandas 中重塑数据框的有效解决方案
【发布时间】:2020-04-29 16:36:10
【问题描述】:

我有一个类似的数据框

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

这可行,但它绝对不是最好的解决方案,因为它的时间复杂度太高。 为此,我需要一个更好、更有效的解决方案。

【问题讨论】:

    标签: python pandas python-2.7 dataframe time-complexity


    【解决方案1】:

    一种方法是stack 删除缺失值,groupbyzip 将每个元素与后续元素聚合。我们只需要使用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
    

    【讨论】:

    • 但是这里缺少 ID 列。在我的实际数据框中,我的 ID 是字符串。我想在转换后出现在 ID 列中。
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 2021-03-05
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2012-12-10
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多