Python 如何将多行连接成一行,并在大数据帧上重复此操作?
我正在使用一个包含582260行和24列的数据帧。每行对应一个24小时向量长度的时间序列,20行(天)对应id_1,20到id_2。。。以此类推直到id_N。我想将id_1的所有20行连接成一行,这样连接的时间序列就变成480(20天*24小时/天)向量长度,并从id_1到id_N重复这个操作 显示了我的数据框的一个非常精简和可复制的版本(ID列应该是一个索引,但出于迭代目的,我重置了它): 我尝试使用下一个函数来迭代数据帧中的行,但它没有给出预期的输出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
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,你的方法很有效。我只是需要做一些调整,但这真的帮了我很大的忙!谢谢你,不客气,你介意吗?