You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按行和列连接DataFrames的技术实现问询及数据集解析

按行/列连接DataFrames的实现方法及给定数据集处理解析

一、核心连接技术实现

在Pandas中,我们常用以下方法来实现DataFrame的行/列连接:

1. 按行连接(纵向拼接)

最常用的是pd.concat(),它可以将多个DataFrame沿纵向(行方向)拼接,替代了已废弃的df.append()方法。

import pandas as pd

# 示例:拼接两个结构相同的DataFrame
df1 = pd.DataFrame({'val': [1,2], 'ts': [1,2], 'user': [1,2]})
df2 = pd.DataFrame({'val': [3,4], 'ts': [3,4], 'user': [3,4]})

# 纵向拼接,重置索引避免重复
row_concat = pd.concat([df1, df2], ignore_index=True)
  • 关键参数:ignore_index=True会重置结果的索引;如果需要保留原DataFrame的来源标记,可以用keys=['df1', 'df2']。

2. 按列连接(横向拼接)

根据需求不同,有三种常用方式:

(1)按索引对齐拼接:pd.concat(axis=1)

适用于两个DataFrame的索引完全匹配的场景:

df_left = pd.DataFrame({'val': [1,21,71], 'visit_id': ['x','z','y']}, index=[0,1,2])
df_right = pd.DataFrame({'ts': [1,21,71], 'user': [1,1,1]}, index=[0,1,2])

col_concat = pd.concat([df_left, df_right], axis=1)
(2)基于索引的关联拼接:df.join()

适合以索引作为关联键的横向连接,支持左连接、内连接等:

# 先将两个DataFrame的索引设置为相同的字段(比如visit_id)
df_left = df_left.set_index('visit_id')
df_right = df_right.set_index('visit_id')

join_result = df_left.join(df_right, how='inner')
(3)基于指定列的关联拼接:pd.merge()

类似SQL的JOIN操作,支持按指定列关联,是最灵活的横向连接方式:

df_a = pd.DataFrame({'user': [1,2,3], 'x_val': [1,2,3]})
df_b = pd.DataFrame({'user': [1,2,4], 'y_val': [71,72,74]})

# 基于user列做内连接
merge_result = pd.merge(df_a, df_b, on='user', how='inner')
  • how参数可选:inner(内连接)、left(左连接)、right(右连接)、outer(全连接)。

二、给定数据集的处理解析

首先我们先将你提供的原始数据加载为Pandas DataFrame:

data = [
    [1, 1, 1, 'x', 0.0], [21, 21, 1, 'z', 0.0], [71, 71, 1, 'y', 0.0],
    [2, 2, 2, 'x', 0.0], [22, 22, 2, 'z', 0.0], [72, 72, 2, 'y', 0.0],
    [3, 3, 3, 'x', 0.0], [23, 23, 3, 'z', 0.0], [73, 73, 3, 'y', 0.0],
    [4, 4, 4, 'x', 0.0], [24, 24, 4, 'z', 0.0], [74, 74, 4, 'y', 0.0],
    [60, 60, 60, 'x', 1.0], [90, 90, 60, 'z', 1.0], [80, 80, 60, 'y', 1.0],
    [91, 91, 61, 'z', 1.0], [81, 81, 61, 'y', 1.0], [61, 61, 61, 'x', 1.0],
    [82, 82, 62, 'y', 1.0], [92, 92, 62, 'z', 1.0], [62, 62, 62, 'x', 1.0],
    [83, 83, 63, 'y', 1.0], [93, 93, 63, 'z', 1.0], [63, 63, 63, 'x', 1.0],
    [64, 64, 64, 'z', 1.0], [64, 64, 64, 'x', 1.0], [94, 94, 64, 'y', 1.0],
    [160, 160, 150, 'y', 2.0], [180, 180, 150, 'z', 2.0], [150, 150, 150, 'x', 2.0],
    [185, 185, 155, 'z', 2.0], [155, 155, 155, 'x', 2.0]
]

df = pd.DataFrame(data, columns=['val', 'ts', 'user', 'visit_id', 'id'])

观察数据可以发现:每个user对应多个visit_id(x/y/z),id字段是分组标记(0.0/1.0/2.0)。以下是几种常见的处理场景:

场景1:将每个user的多visit_id数据转为宽表

把同一个user的x/y/z对应的val值展开为单独的列,方便后续分析:

# 按user和id分组,将visit_id转为列,val作为值
wide_df = df.pivot(index=['user', 'id'], columns='visit_id', values='val').reset_index()
# 清理列名
wide_df.columns.name = None
wide_df = wide_df.rename(columns={'x': 'x_val', 'y': 'y_val', 'z': 'z_val'})

处理后的数据结构示例:

useridx_valy_valz_val
10.017121
20.027222

场景2:按id分组后拼接数据

如果需要将不同id组的数据分开处理后再合并:

# 拆分三个id组
group0 = df[df['id'] == 0.0]
group1 = df[df['id'] == 1.0]
group2 = df[df['id'] == 2.0]

# 纵向拼接并标记分组来源
combined_df = pd.concat(
    [group0, group1, group2],
    keys=['id_0', 'id_1', 'id_2'],
    names=['group', 'original_index']
)

这样可以通过group列快速区分不同id组的数据。

场景3:横向拼接同user的完整visit信息

如果需要把同一个user的x/y/z对应的val和ts都放在同一行:

# 拆分不同visit_id的DataFrame并重命名列
df_x = df[df['visit_id'] == 'x'].rename(columns={'val': 'x_val', 'ts': 'x_ts'}).drop('visit_id', axis=1)
df_y = df[df['visit_id'] == 'y'].rename(columns={'val': 'y_val', 'ts': 'y_ts'}).drop('visit_id', axis=1)
df_z = df[df['visit_id'] == 'z'].rename(columns={'val': 'z_val', 'ts': 'z_ts'}).drop('visit_id', axis=1)

# 基于user和id做三次横向拼接
full_user_df = pd.merge(pd.merge(df_x, df_y, on=['user', 'id']), df_z, on=['user', 'id'])

处理后每个user一行,包含所有visit的详细数据。


内容的提问来源于stack exchange,提问作者mkmostafa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:24:47