如何将多行连接成一行并在大数据帧上重复此操作?

How to concatenate multiple rows into a single row and repeate this operation over a big dataframe?

我正在处理一个包含 582,260 行和 24 列的数据框。每行对应一个24小时向量长度的时间序列,20行(天)对应id_1,20行(天)对应id_2……以此类推,直至id_N。我想将 id_1 的所有 20 行连接成一行,以便我连接的时间序列成为 480(20 天 * 24 hrs/day)向量长度,并从 id_1 到 id_N.

显示了我的数据框的一个非常精简且可重现的版本(ID 列应该是一个索引,但出于迭代目的我重置了它):

df = pd.DataFrame([['id1', 1, 1, 3, 4, 1], ['id1', 0, 1, 5, 2, 1], ['id1', 3, 4, 5, 0, 0], 
                   ['id2', 1, 1, 8, 0, 6], ['id2', 5, 3, 1, 1, 2], ['id2', 5, 4, 5, 2, 7]],
                  columns = ['ID', 'h0', 'h1', 'h2', 'h3', 'h4'] )

我已经尝试使用下一个函数迭代数据框中的行,但它没有给我预期的输出。

def concatenation(df):
    for i, row in df.iterrows():
        if df.ix[i]['ID'] == df.ix[i+1]['ID']:
            pd.concat([df], axis = 1)
            return(df)

concatenation(df)

预期输出应如下所示:

df = pd.DataFrame([['id1', 1, 1, 3, 4, 1, 0, 1, 5, 2, 1, 3, 4, 5, 0, 0], 
                   ['id2', 1, 1, 8, 0, 6, 5, 3, 1, 1, 2, 5, 4, 5, 2, 7]],
                  columns = ['ID', 'h0', 'h1', 'h2', 'h3', 'h4', 
                             'h0', 'h1', 'h2', 'h3', 'h4',
                             'h0', 'h1', 'h2', 'h3', 'h4'])

是否有使用 pandas 工具对这个任务进行编程的紧凑而优雅的方法?

提前感谢您的帮助。

您可以使用 defaultdict(list).extend() 方法以准确的顺序存储所有值并创建与您定义的相同的输出。

但这需要你做一个粗略的循环,不推荐用于大型数据帧。

首先添加一列 day,然后创建 IDday 的分层索引,然后将其取消堆叠:

df['day'] = df.groupby('ID').cumcount()
df = df.set_index(['ID','day'])
res = df.unstack()

中间结果:

      h0       h1       h2       h3       h4      
day    0  1  2  0  1  2  0  1  2  0  1  2  0  1  2
ID                                                
id1    1  0  3  1  1  4  3  5  5  4  2  0  1  1  0
id2    1  5  5  1  3  4  8  1  5  0  1  2  6  2  7

现在我们按要求展平索引和 re-order 列:

res.set_axis([f"{y}{x}" for x, y in res.columns], axis=1, inplace=True)
res = res.reindex(sorted(res.columns), axis=1)

最终结果:

     0h0  0h1  0h2  0h3  0h4  1h0  1h1  1h2  1h3  1h4  2h0  2h1  2h2  2h3  2h4
ID                                                                            
id1    1    1    3    4    1    0    1    5    2    1    3    4    5    0    0
id2    1    1    8    0    6    5    3    1    1    2    5    4    5    2    7