Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多行连接成一行,并在大数据帧上重复此操作?_Python_Pandas_Concat - Fatal编程技术网

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

Python 如何将多行连接成一行,并在大数据帧上重复此操作?,python,pandas,concat,Python,Pandas,Concat,我正在使用一个包含582260行和24列的数据帧。每行对应一个24小时向量长度的时间序列,20行(天)对应id_1,20到id_2。。。以此类推直到id_N。我想将id_1的所有20行连接成一行,这样连接的时间序列就变成480(20天*24小时/天)向量长度,并从id_1到id_N重复这个操作 显示了我的数据框的一个非常精简和可复制的版本(ID列应该是一个索引,但出于迭代目的,我重置了它): 我尝试使用下一个函数来迭代数据帧中的行,但它没有给出预期的输出 def concatenation(df

我正在使用一个包含582260行和24列的数据帧。每行对应一个24小时向量长度的时间序列,20行(天)对应id_1,20到id_2。。。以此类推直到id_N。我想将id_1的所有20行连接成一行,这样连接的时间序列就变成480(20天*24小时/天)向量长度,并从id_1到id_N重复这个操作

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

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

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()
方法以精确顺序存储所有值,并创建与您定义的相同的输出


但这需要您执行一个不建议用于大型数据帧的粗略循环。

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


但这需要您执行一个不建议用于大型数据帧的粗略循环。

首先添加一列
day
,然后创建一个
ID
day
的层次索引,然后将其取消堆栈:

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
现在,我们将索引展平,并根据要求对列重新排序:

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

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

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
现在,我们将索引展平,并根据要求对列重新排序:

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

对不起,你能说得更具体一点吗?谢谢。对不起,你能说得更具体一点吗?谢谢。非常感谢@Stef,我在原始数据帧中尝试了您的解决方案,但它引发了
ValueError:Unstacked dataframe太大,导致int32溢出
错误。我想是因为它的尺寸。我会努力寻找解决这个问题的方法。非常感谢@Stef,你的方法很有效。我只是需要做一些调整,但这真的帮了我很大的忙!非常感谢。不客气-您介意吗?非常感谢@Stef,我在原始数据帧中尝试了您的解决方案,但它会引发
值错误:未堆叠的数据帧太大,导致int32溢出
错误。我想是因为它的尺寸。我会努力寻找解决这个问题的方法。非常感谢@Stef,你的方法很有效。我只是需要做一些调整,但这真的帮了我很大的忙!谢谢你,不客气,你介意吗?