基于2015-01-01起始周的会员事件数据格式转换求助
Got it, let's work through this problem together. I'll walk you through how to build that nested list structure for each member, aligned to weekly periods starting from 2015-01-01 using pandas. We'll assume your original DataFrame has columns like member_id, event_date, and event_type (1=注册, 2=结账, 3=取消).
Step 1: Prepare Your Data & Define Weekly Periods
First, let's make sure your date column is properly formatted, then generate the full range of weekly starting dates we need to cover (from 2015-01-01 up to the latest event date in your data).
import pandas as pd # Example raw DataFrame (replace with your actual data) raw_data = { 'member_id': [101, 101, 102, 102], 'event_date': ['2015-01-02', '2015-01-10', '2015-01-03', '2015-01-15'], 'event_type': [1, 2, 1, 3] } df = pd.DataFrame(raw_data) df['event_date'] = pd.to_datetime(df['event_date']) # Define the starting week and generate all weekly periods start_date = pd.to_datetime('2015-01-01') end_date = df['event_date'].max() # Extend to today with pd.Timestamp.today() if needed # Use 'W-MON' for Monday-start weeks, 'W-SUN' for Sunday-start, or '7D' for fixed 7-day intervals weekly_starts = pd.date_range(start=start_date, end=end_date, freq='W-MON')
Step 2: Create a Full Member-Week Grid
We need to ensure every member has a row for every week (even if they had no event). We'll create a cross join of unique members and weekly start dates.
# Get unique member IDs unique_members = df['member_id'].unique() # Create a grid of every member + every weekly start date member_week_grid = pd.MultiIndex.from_product( [unique_members, weekly_starts], names=['member_id', 'week_start'] ).to_frame(index=False)
Step 3: Merge with Event Data & Fill Missing Values
Now we'll merge this grid with your original event data, then fill in 0 for weeks where a member had no events.
# Map each event date to its corresponding weekly start date (match the freq from Step 1) df['week_start'] = df['event_date'].dt.to_period('W-MON').dt.start_time # Merge the grid with event data, keeping all weeks from the grid merged_df = member_week_grid.merge( df, on=['member_id', 'week_start'], how='left' ) # Fill missing event types with 0 (no event) and convert to integer merged_df['event_type'] = merged_df['event_type'].fillna(0).astype(int)
Step 4: Generate the Nested List Structure
Finally, group by member ID and collect the weekly event types into ordered lists.
# Group by member and extract event_type lists in week order nested_event_lists = merged_df.groupby('member_id')['event_type'].apply(list).tolist() # Example output: [[1, 2, 0], [1, 0, 3]] print(nested_event_lists)
Notes for Adjustments:
- If you need weeks to start exactly on 2015-01-01 and every 7 days after (instead of natural calendar weeks), replace
freq='W-MON'withfreq='7D'in both Step 1 and thedt.to_period()call. - To include weeks up to the current date, set
end_date = pd.Timestamp.today().
内容的提问来源于stack exchange,提问作者superflow

