我有一个这样的数据帧:
df = pd.DataFrame({'id':[10,20,30,40],'text':['some text','another text','random stuff', 'my cat is a god'],
'A':[0,0,1,1],
'B':[1,1,0,0],
'C':[0,0,0,1],
'D':[1,0,1,0]})
这里我有从A
到D
的列,但我的实际数据帧有100个值为0
和1
的列。这个真实的数据帧有10万个反应词。
例如,列A
与text
的第3行和第4行相关,因为它被标记为1
。同样,A
与text
的第一行和第二行无关,因为它被标记为0
。
我需要做的是对这个数据帧进行采样,使其具有相同或大约相同数量的功能。
在这种情况下,特征C
只有一个occurrece,所以我需要以这样的方式过滤所有其他列,即我有一个文本带有A
,一个text
带有B
,一个text
带有C
等等
最好的方法是:例如,我可以使用n=100
进行设置,这意味着我希望以一种拥有100条具有所有功能的记录的方式进行采样。
这个数据集是一个多标签数据集训练,非常不平衡,我正在为机器学习任务寻找平衡它的最佳方法。
重要:我不想排除0
功能。我只想用1
和0
有大约相同数量的列
例如。对于具有1k个记录的最终数据集,我希望具有从A
到final_column
的所有列,以及具有相同编号的1
和0
的所有这些列。为了实现这一点,我将需要随机丢弃text
行并且仅丢弃id
。
我尝试的方法是查找具有最低1
和0
计数的特征,然后使用该值作为阈值。
编辑1:我认为一种可能的方法是使用:
df.sum(axis=0, skipna=True)
然后我可以使用和值最低的列作为阈值来过滤文本列。我不知道如何做这个过滤步骤
感谢
您期望的确切输出尚不清楚,但假设您希望每个字母有1个随机行,则可以重新整形(同时去掉0(并使用GroupBy.sample
:
(df
.set_index(['id', 'text'])
.replace(0, float('nan'))
.stack()
.groupby(level=-1).sample(n=1)
.reset_index()
)
注意。如果需要,可以重命名列输出:
id text level_2 0
0 30 random stuff A 1.0
1 20 another text B 1.0
2 40 my cat is a god C 1.0
3 30 random stuff D 1.0