如何在Pandas中按指定字符串值拆分DataFrame?
按指定字符串拆分Pandas DataFrame
问题场景
给定如下DataFrame,需要在txn_details列出现opening_balance时拆分,将每个opening_balance及其后续(直到下一个opening_balance前)的行拆分为独立的DataFrame:
txn_details amt 0 opening_balance 13000 1 opening_balance 15000 2 upi2873 12879 3 upi182y31 12301 4 opening_balance 85050 5 upi79279831 8400
期望得到3个独立的DataFrame,每个以opening_balance起始。
解决方案
核心思路是用cumsum()生成分组标识,再通过groupby拆分。具体代码如下:
import pandas as pd # 构建示例DataFrame data = { 'txn_details': ['opening_balance', 'opening_balance', 'upi2873', 'upi182y31', 'opening_balance', 'upi79279831'], 'amt': [13000, 15000, 12879, 12301, 85050, 8400] } df = pd.DataFrame(data) # 生成分组ID:每次遇到opening_balance,分组ID递增 df['group_id'] = (df['txn_details'] == 'opening_balance').cumsum() # 按分组ID拆分,移除临时的group_id列 split_dfs = [group.drop('group_id', axis=1) for _, group in df.groupby('group_id')] # 赋值给指定变量 df_1 = split_dfs[0] df_2 = split_dfs[1] df_3 = split_dfs[2]
验证输出
- df_1输出:
txn_details amt 0 opening_balance 13000
- df_2输出:
txn_details amt 1 opening_balance 15000 2 upi2873 12879 3 upi182y31 12301
- df_3输出:
txn_details amt 4 opening_balance 85050 5 upi79279831 8400
说明
如果之前使用cumsum()未得到预期结果,大概率是没正确将条件判断的布尔值转为累加的分组ID。这里(df['txn_details'] == 'opening_balance').cumsum()会为每个连续的分组生成唯一ID,确保每个opening_balance开头的区块被正确拆分。
内容的提问来源于stack exchange,提问作者Vaishnav
相关产品推荐
相关产品推荐

