如何将多行连接成一行并在大数据帧上重复此操作?
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
,然后创建 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
现在我们按要求展平索引和 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
我正在处理一个包含 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
,然后创建 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
现在我们按要求展平索引和 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