基于整数列拆分Pandas DataFrame:拆分下蛋鸡行并聚合未下蛋鸡行
解决方案:DataFrame按鸡的下蛋状态拆分与聚合
没问题,我来帮你搞定这个DataFrame的拆分需求!首先咱们先明确下数据结构,假设你的原始DataFrame df1 是这样的(每行代表某个农场里某类鸡的数量,egg 标记是否下蛋):
import pandas as pd df1 = pd.DataFrame({ 'farm': ['A', 'A'], 'chicken': [2, 3], 'egg': [True, False] })
接下来分三步实现需求:
- 拆分下蛋的鸡:对于
egg=True的行,我们把数量拆成对应个数的单独行,每行代表一只鸡(重量设为1)。这里用apply把数量转换成包含N个1的列表,再用explode展开成多行。 - 保留未下蛋的鸡:
egg=False的行直接保留,不需要拆分,聚合为一行显示总重量。 - 合并结果:把两部分数据拼接起来就是最终的
df2。
具体代码实现
# 处理下蛋的鸡,拆分成单独行 df_egg_true = df1[df1['egg'] == True].assign( chicken=lambda x: x['chicken'].apply(lambda n: [1]*n) ).explode('chicken', ignore_index=True) # 处理未下蛋的鸡,直接保留原行 df_egg_false = df1[df1['egg'] == False].copy() # 合并两个部分得到最终结果 df2 = pd.concat([df_egg_true, df_egg_false], ignore_index=True)
运行后 df2 的结果如下,完全符合你的示例需求:
| farm | chicken | egg |
|---|---|---|
| A | 1 | True |
| A | 1 | True |
| A | 3 | False |
适配原始数据为单一行的情况
如果你的原始DataFrame是每个农场一行(包含总鸡数和下蛋鸡数),比如:
df1 = pd.DataFrame({ 'farm': ['A'], 'total_chicken': [5], 'egg_chicken': [2] })
可以先构造出下蛋和未下蛋的分组数据,再按上述逻辑处理:
# 先拆分出下蛋和未下蛋的分组 temp_df = pd.DataFrame({ 'farm': df1['farm'].repeat(2), 'chicken': [df1['egg_chicken'].iloc[0], df1['total_chicken'].iloc[0] - df1['egg_chicken'].iloc[0]], 'egg': [True, False] }) # 后续处理和之前一致 df_egg_true = temp_df[temp_df['egg'] == True].assign( chicken=lambda x: x['chicken'].apply(lambda n: [1]*n) ).explode('chicken', ignore_index=True) df_egg_false = temp_df[temp_df['egg'] == False].copy() df2 = pd.concat([df_egg_true, df_egg_false], ignore_index=True)
这样就能得到你想要的拆分结果啦!
内容的提问来源于stack exchange,提问作者Julien Massardier
相关产品推荐
相关产品推荐

