如何在Pandas中动态将DataFrame列拆分为多行?
Pandas宽表转长表:拆分列生成多行数据
没问题,我来帮你搞定这个需求!你现在需要把每行包含多列数据的DataFrame,拆分成每列对应一行的新数据,这在Pandas里属于宽表转长表的典型场景,用melt()函数就能轻松实现。
第一步:先明确你的数据结构
先给你构造一个和你描述匹配的示例DataFrame,方便你对照:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'institution_short_name': ['Bank of Demo', 'Demo Credit Union'], 'interest_paid1': [1.25, 1.48], 'interest_paid2': [1.32, 1.55], 'product_detail_value_min': [500, 1000], 'term_01m_value': [2.1, 2.3], 'term_02y_value': [3.6, 3.8], 'term_03m_value': [2.6, 2.8] })
第二步:用melt()实现列转行
我们需要指定哪些列是保留的标识符列(比如institution_short_name和product_detail_value_min,这些列的值不需要拆分,会跟着每一行新数据保留),哪些是需要拆分的列,同时自定义新生成的列名:
# 执行宽表转长表操作 melted_df = df.melt( # 保留的标识符列,这些列的值会重复出现在每一行新数据中 id_vars=['institution_short_name', 'product_detail_value_min'], # 新生成的“原列名”对应的列名 var_name='metric_category', # 新生成的“原列值”对应的列名 value_name='metric_value' )
如果你只想拆分特定列(比如只拆interest_paid系列),可以加上
value_vars=['interest_paid1', 'interest_paid2']参数指定目标列,默认会拆分所有非id_vars的列。
第三步:看转换后的结果
转换后的melted_df会变成这样的结构(简化展示):
| institution_short_name | product_detail_value_min | metric_category | metric_value |
|---|---|---|---|
| Bank of Demo | 500 | interest_paid1 | 1.25 |
| Demo Credit Union | 1000 | interest_paid1 | 1.48 |
| Bank of Demo | 500 | interest_paid2 | 1.32 |
| Demo Credit Union | 1000 | interest_paid2 | 1.55 |
| Bank of Demo | 500 | term_01m_value | 2.1 |
| ... | ... | ... | ... |
可选:拆分不同类型的列(如果需要分开处理)
如果你想把interest_paid系列和term系列分开拆分,再合并成更细致的结构,可以这么做:
# 单独拆分interest_paid列 interest_df = df.melt( id_vars=['institution_short_name', 'product_detail_value_min'], value_vars=['interest_paid1', 'interest_paid2'], var_name='interest_paid_index', value_name='interest_amount' ) # 单独拆分term列 term_df = df.melt( id_vars=['institution_short_name', 'product_detail_value_min'], value_vars=['term_01m_value', 'term_02y_value', 'term_03m_value'], var_name='term_type', value_name='term_rate' ) # 合并两个表,得到每个机构+产品最小值对应的所有利息和期限组合 merged_df = pd.merge(interest_df, term_df, on=['institution_short_name', 'product_detail_value_min'])
这样就能根据你的具体需求灵活调整拆分方式啦!
内容的提问来源于stack exchange,提问作者Phil Baines
相关产品推荐
相关产品推荐

