根据其他列的唯一值从数据框中选择行?

时间:2019-06-07 13:09:53

标签: python pandas dataframe scikit-learn data-transform

数据框的其中一列具有如下所示的值:

air_voice_no_null.loc[:,"host_has_profile_pic"].value_counts(normalize = True)*100

1.0    99.694276
0.0     0.305724
Name: host_has_profile_pic, dtype: float64

该列中每个唯一值的比例为99:1。

我现在想创建一个新的数据框,使其具有该数据框的60%的1.0和40%的0.0以及所有行(当然行数更少)。

我尝试使用strat类的train_test_split类的sklearn.model_selection函数进行拆分,如下所示,但是运气不好,无法获得每个唯一值具有相等比例的数据帧。

from sklearn.model_selection import train_test_split

profile_train_x, profile_test_x, profile_train_y, profile_test_y = train_test_split(air_voice_no_null.loc[:,['log_price', 'accommodates', 'bathrooms','host_response_rate', 'number_of_reviews', 'review_scores_rating','bedrooms', 'beds', 'cleaning_fee', 'instant_bookable']],
                                                                                   air_voice_no_null.loc[:,"host_has_profile_pic"],
                                                                                   random_state=42, stratify=air_voice_no_null.loc[:,"host_has_profile_pic"])

这就是上面的代码产生的结果,行数没有变化。

print(profile_train_x.shape)
print(profile_test_x.shape)
print(profile_train_y.shape)
print(profile_test_y.shape)

(55442, 10)
(18481, 10)
(55442,)
(18481,)

如何选择数据集的行数减少的子集,同时保持host_has_profile_pic变量的每个类的适当比例。

链接到完整的数据集:https://www.kaggle.com/stevezhenghp/airbnb-price-prediction

1 个答案:

答案 0 :(得分:1)

请考虑以下方法:

import pandas as pd

# create some data
df = pd.DataFrame({'a': [0] * 10 + [1] * 90})

print('original proportion:')
print(df['a'].value_counts(normalize=True))

# take samples for every unique value separately
df_new = pd.concat([
    df[df['a'] == 0].sample(frac=.4),
    df[df['a'] == 1].sample(frac=.07)])

print('\nsample proportion:')
print(df_new['a'].value_counts(normalize=True))

输出:

original proportion:
1    0.9
0    0.1
Name: a, dtype: float64

sample proportion:
1    0.6
0    0.4
Name: a, dtype: float64