为每个列值拆分具有相等行数的 Pandas 数据框

时间:2021-01-16 16:10:44

标签: python pandas dataframe machine-learning

这是一个机器学习项目。
我有一个 CSV 文件,我已将其作为 Pandas 数据框读入。 CSV 如下所示:

id,label
f38a6374c348f90b587e046aac6079959adf3835,0
c18f2d887b7ae4f6742ee445113fa1aef383ed77,1
755db6279dae599ebb4d39a9123cce439965282d,0
bc3f0c64fb968ff4a8bd33af6971ecae77c75e08,0
068aba587a4950175d04c680d38943fd488d6a9d,0
acfe80838488fae3c89bd21ade75be5c34e66be7,0
a24ce148f6ffa7ef8eefb4efb12ebffe8dd700da,1
7f6ccae485af121e0b6ee733022e226ee6b0c65f,1
559e55a64c9ba828f700e948f6886f4cea919261,0
8eaaa7a400aa79d36c2440a4aa101cc14256cda4,0
...
[220025 rows x 2 columns]

我减少了样本大小并均衡了数据,这样我就有了一个包含 60,000 行的数据框; 30,000 行,标签为 1 和标签 0。我现在想将数据帧分成两部分,一个数据帧有 50,000 行,另一个有 10,000,但我希望每个数据帧具有相同数量的带有标签 1 和标签 0 的行。

有一些更长的解决方案,例如拆分数据帧,然后使用 .frac() 制作两个数据帧,然后合并备用数据帧,但这会不必要地复杂。

是否有任何方法可以将数据帧拆分为每个标签的行数相等,但每个数据帧中的总行数不同?

这是我使用的代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import cv2
import random

df = pd.read_csv("../input/histopathologic-cancer-detection/train_labels.csv")

ones_subset = df.loc[df["label"] == 1, :]
num_ones = len(ones_subset)

zeros_subset = df.loc[df["label"] == 0, :]
sampled_zeros = zeros_subset.sample(num_ones)

print(num_ones)
print(sampled_zeros)

df = pd.concat([ones_subset, sampled_zeros], ignore_index=True)
df = df.groupby("label").sample(30000).sample(frac=1).reset_index(drop=True)
print(df)

1 个答案:

答案 0 :(得分:2)

试试 sklearn + stratify

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.16, random_state=19, stratify=df['label'])
相关问题