如何在 2 个独立的数据集上划分数据帧,其中 70%/30% 的唯一 id 为 Python Pandas 中的每个 id 获取所有行?

问题描述 投票:0回答:1

我在 Python Pandas 中有数据框,如下所示:

输入数据:

df = pd.DataFrame({
    'id' : [999, 999, 999, 185, 185, 185, 44, 44, 44],
    'target' : [1, 1, 1, 0, 0, 0, 1, 1, 1],
    'event_date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'],
    'event1': [1, 6, 11, 16, np.nan, 22, 74, 109, 52],
    'event2': [2, 7, np.nan, 17, 22, np.nan, np.nan, 10, 5],
    'event3': [3, 8, 13, 18, 23, np.nan, 2, np.nan, 99],
    'event4': [4, 9, np.nan, np.nan, np.nan, 11, 8, np.nan, np.nan],
    'event5': [5, np.nan, 15, 20, 25, 1, 1, 3, np.nan]
})

# Wypełnienie brakujących wartości zerami
df = df.fillna(0)
df

要求:

我的真实数据集当然有更多的数据,但我需要根据以下要求将我的数据集划分为 2 个单独的数据集(训练和测试):

  1. 对于训练数据集,我需要从输入数据集中获取 70% 的唯一 ID
  2. 对于测试数据集,我需要从输入数据集中获取 30% 的唯一 ID
  3. 对于每个新数据集,我需要为每个 id 获取所有行,请注意,每个 id 在我的输入数据集中具有相同的行数(对于某些 id,我们只获取 2 行,对于其他 id,我们不能这样)取 3,始终取给定 id 的所有行)

所需结果的示例(当然在实际数据中应该是唯一ID的比例70%/30%):

训练数据集:

df = pd.DataFrame({
    'id' : [999, 999, 999, 185, 185, 185],
    'target' : [1, 1, 1, 0, 0, 0],
    'event_date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'],
    'event1': [1, 6, 11, 16, np.nan, 22],
    'event2': [2, 7, np.nan, 17, 22, np.nan],
    'event3': [3, 8, 13, 18, 23, np.nan],
    'event4': [4, 9, np.nan, np.nan, np.nan, 11],
    'event5': [5, np.nan, 15, 20, 25, 1]
})

df = df.fillna(0)
df

测试数据集:

df = pd.DataFrame({
    'id' : [44, 44, 44],
    'target' : [1, 1, 1],
    'event_date': ['2023-01-01', '2023-01-02', '2023-01-03'],
    'event1': [74, 109, 52],
    'event2': [ np.nan, 10, 5],
    'event3': [2, np.nan, 99],
    'event4': [8, np.nan, np.nan],
    'event5': [1, 3, np.nan]
})

# Wypełnienie brakujących wartości zerami
df = df.fillna(0)
df
python pandas dataset
1个回答
1
投票

删除重复项,

sample
,然后用它来分割数据:

keep = df['id'].drop_duplicates().sample(frac=0.7)

m = df['id'].isin(keep)

train = df[m]
test = df[~m]
© www.soinside.com 2019 - 2024. All rights reserved.