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

zf9nrax1  于 2023-11-15  发布在  Python
关注(0)|答案(1)|浏览(93)

我在Python Pandas中有一个Data Frame,如下所示:

输入数据:

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

字符串
x1c 0d1x的数据

要求:

我的真实的数据集当然有更多的数据,但我需要根据以下要求将我的数据集分为两个单独的数据集(训练和测试):
1.对于训练数据集,我需要从输入数据集中获取70%的唯一ID
1.对于测试数据集,我需要从我的输入数据集中获取30%的唯一ID
1.对于每个新数据集,我需要为每个id获取所有行,请注意每个id在我的输入数据集中具有相同的行数**(对于某些id,我们只获取2行,对于其他id,我们获取3行,总是获取给定id的所有行)**

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

  • 训练数据集:*
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

bzzcjhmw

bzzcjhmw1#

使用drop_duplicatessample删除重复项,然后使用isin构建掩码来分割数据:

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

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

train = df[m]
test = df[~m]

字符串
使用set的变体:

import random

S = list(set(df['id']))

keep = random.sample(S, k=round(len(S)*0.7))

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


输出示例:

# test
    id  target  event_date  event1  event2  event3  event4  event5
0  999       1  2023-01-01     1.0     2.0     3.0     4.0     5.0
1  999       1  2023-01-02     6.0     7.0     8.0     9.0     0.0
2  999       1  2023-01-03    11.0     0.0    13.0     0.0    15.0
6   44       1  2023-01-01    74.0     0.0     2.0     8.0     1.0
7   44       1  2023-01-02   109.0    10.0     0.0     0.0     3.0
8   44       1  2023-01-03    52.0     5.0    99.0     0.0     0.0

# train
    id  target  event_date  event1  event2  event3  event4  event5
3  185       0  2023-01-01    16.0    17.0    18.0     0.0    20.0
4  185       0  2023-01-02     0.0    22.0    23.0     0.0    25.0
5  185       0  2023-01-03    22.0     0.0     0.0    11.0     1.0

相关问题