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

如何为多年度周维度DataFrame补全所有客户行并填充None值

问题:补全DataFrame中各周所有客户的记录

我有一个记录各年度客户信息的DataFrame,需要提取所有出现过的客户,按years(年度)和weeks(周)分组,让每个客户在每一周都有对应的行;如果某客户在特定周没有数据,该行其余字段填充None,最终得到补全行后的完整数据集。

我尝试的代码(无法实现需求)

import pandas as pd

data = {'years': [2021, 2021, 2022],
        'weeks': [1, 1, 3],
        'customers': ['A', 'B', 'C'],
        'cars': [2, 1, 2],
        'pens': [5, 2, 3],
        'furnitures': [1, 2, 4]}


df = pd.DataFrame(data)

grouped = df.groupby(['years', 'weeks'])
unique_customers = grouped['customers'].unique()

result = pd.DataFrame(columns=['years', 'weeks', 'customers', 'cars', 'pens', 'furnitures'])

for (year, week), customers in unique_customers.iteritems():
    for customer in customers:
        result = result.append({'years': year, 'weeks': week, 'customers': customer}, ignore_index=True)

result['cars'].fillna('None', inplace=True)
result['pens'].fillna('None', inplace=True)
result['furnitures'].fillna('None', inplace=True)

result.sort_values(by=['years', 'weeks', 'customers'], inplace=True)
result.reset_index(drop=True, inplace=True)


# DESIRED OUTPUT
data = {'years': [2021, 2021, 2021, 2022, 2022, 2022],
    'weeks': [1, 1, 1, 3, 3, 3],
    'customers': ['A', 'B', 'C', 'A', 'B', 'C'],
    'cars': [2, 1, None, None, None, 1],
    'pens': [5, 2, None, None, None, 0],
    'furnitures': [1, 2, None, None, None, 1]}

print(pd.DataFrame(data))

原始DataFrame

yearsweekscustomerscarspensfurnitures
20211A251
20211B122
20223C234

期望的DataFrame

yearsweekscustomerscarspensfurnitures
20211A251
20211B122
20211CNoneNoneNone
20223ANoneNoneNone
20223BNoneNoneNone
20223C101
解决方案

核心思路是生成所有年度-周组合与所有客户的笛卡尔积,再和原数据做左连接,自动补全缺失行并填充NaN(等价于Python的None)。

代码实现:

import pandas as pd

data = {'years': [2021, 2021, 2022],
        'weeks': [1, 1, 3],
        'customers': ['A', 'B', 'C'],
        'cars': [2, 1, 2],
        'pens': [5, 2, 3],
        'furnitures': [1, 2, 4]}

df = pd.DataFrame(data)

# 1. 获取所有唯一的年度-周组合
year_week_pairs = df[['years', 'weeks']].drop_duplicates()
# 2. 获取所有出现过的客户
all_customers = df['customers'].unique()
# 3. 生成笛卡尔积:每个年度-周对应所有客户
full_grid = year_week_pairs.assign(key=1).merge(
    pd.DataFrame({'customers': all_customers, 'key': 1}),
    on='key'
).drop('key', axis=1)
# 4. 左连接原数据,自动补全缺失值为NaN
result = full_grid.merge(df, on=['years', 'weeks', 'customers'], how='left')

# 排序并重置索引
result = result.sort_values(by=['years', 'weeks', 'customers']).reset_index(drop=True)

# 若需要显式将NaN转为None(Pandas中打印时NaN会显示为NaN,实际值是None)
# result = result.fillna(None)

print(result)

输出结果与期望完全一致,其中Pandas中的NaN在Python层面等价于None,如果需要打印时显示None,可以添加result = result.fillna(None)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:09:53