根据列条件删除相等的行数

时间:2019-03-04 19:08:26

标签: python pandas

我正在尝试减小数据框的大小,并且需要保持每个类(标签)的数量相等。如何根据“标签”列删除相等数量的行。换句话说,我需要在结果数据框中均匀分配类标签。

我有以下数据框:

    pd.DataFrame([{'label': 0, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 1, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 2, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 3, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 1},
 {'label': 4, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 5, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 5},
 {'label': 6, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 7, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 8, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 9, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 0, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 1, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 2, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 3, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 1},
 {'label': 4, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 5, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 5},
 {'label': 6, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 7, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 8, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0},
 {'label': 9, 'pixel1': 0, 'pixel2': 0, 'pixel3': 0, 'pixel4': 0}])

结果数据框将有10行,每行带有一个unueue标签。我需要这个答案才能适用于具有1000行的较大数据集。

3 个答案:

答案 0 :(得分:1)

如果要每个“标签”组中的第一条记录。

df.groupby('label').head(1)

输出:

   label  pixel1  pixel2  pixel3  pixel4
0      0       0       0       0       0
1      1       0       0       0       0
2      2       0       0       0       0
3      3       0       0       0       1
4      4       0       0       0       0
5      5       0       0       0       5
6      6       0       0       0       0
7      7       0       0       0       0
8      8       0       0       0       0
9      9       0       0       0       0

或者您可以从每个“标签”组中获得随机记录。

df.groupby('label', as_index=False).apply(lambda x: x.sample(1)).reset_index(drop=True)

输出:

   label  pixel1  pixel2  pixel3  pixel4
0      0       0       0       0       0
1      1       0       0       0       0
2      2       0       0       0       0
3      3       0       0       0       1
4      4       0       0       0       0
5      5       0       0       0       5
6      6       0       0       0       0
7      7       0       0       0       0
8      8       0       0       0       0
9      9       0       0       0       0

答案 1 :(得分:1)

您可以

yourDataFrame.drop_duplicates('label')

答案 2 :(得分:0)

创建df后,它有20行,每个label出现两次

因此,为了让每行一次(无重复),您可以 使用:drop_duplicatessubset = 'label'

df.drop_duplicates(subset='label', inplace=True); df

编辑

但是,如果您有各种行,且行数相同,label(在每个行中, 带有相同标签的组),您必须采用其他方法:

从计算每个label发生多少次开始:

df.groupby('label').size()

我们还想知道最小组数

minGrpCnt = df.groupby('label').size().min()

为了不丢失任何组,您可以从中删除 minGrpCnt-1 行 每个组。

要查找这些行,可以使用cumcount函数,对每个组中的行编号,从从0 开始。

例如如果minGrpCnt = 2,则可以使用 cumcount() = 0(仅每组的第一行)。

通常,我们对带有cumcount() < minGrpCnt - 1的行感兴趣。

我们必须找到这些行的索引(df[<predicate>].index)并删除 这些索引的行。

总而言之,执行任务的命令是:

df.drop(df[df.groupby('label').cumcount() < minGrpCnt - 1].index, inplace=True)