Pandas - 根据比例获取前n行

21
我有一个数据框,我想要弹出一定数量的记录,但是我想要传递一个百分比值而不是数字。
例如, df.head(n=10) 从数据集中弹出前10个记录。我希望进行一个小变化,取代10条记录,我想要弹出5%的记录。
如何在pandas中实现这个功能?
我正在寻找这样的代码, df.head(frac=0.05) 是否有什么简单的方法可以实现这个功能?

你是否正在寻找 df.sample(frac=*) - shivsn
@shivsn- 不,我不需要样本。我想要前n%行。但是我希望df.head的方式与df.sample类似。 - Mohamed Thasin ah
6个回答

32

我想要弹出前5%的记录

虽然没有内置的方法,但你可以这样做:

你可以乘以总行数和你的百分比,然后将结果作为head方法的参数。

n = 5
df.head(int(len(df)*(n/100)))

如果你的数据框包含1000行,而n = 5%,那么你将获得前50行。


3

我已经根据Mihai的答案对其进行了扩展,这可能对外界的人有用。目的是为时间序列采样自动选择前n条记录,以便确保您在训练时使用旧记录并在测试时使用最新记录。

# having 
# import pandas as pd 
# df = pd.DataFrame... 

def sample_first_prows(data, perc=0.7):
    import pandas as pd
    return data.head(int(len(data)*(perc)))

train = sample_first_prows(df)
test = df.iloc[max(train.index):]

1

我也遇到了同样的问题,@mihai的解决方案很有用。对于我的情况,我进行了重写:

    percentage_to_take = 5/100
    rows = int(df.shape[0]*percentage_to_take)
    df.head(rows)

我认为对于最后百分比的行,df.tail(rows) 或者 df.head(-rows) 同样可行。


0

也许这会有帮助:

tt  = tmp.groupby('id').apply(lambda x: x.head(int(len(x)*0.05))).reset_index(drop=True)

0
使用pandas 2.1版本,通过下面的示例中的quantile方法更容易地获取数据的前10%和后10%。
 df.loc[
    (df['Column'] < df['Column'].quantile(.10)) |
    (df['Column'] > df['Column'].quantile(.90))
]

这假设至少有一列具有数值类型,但OP并未指定。 - undefined

-3
df=pd.DataFrame(np.random.randn(10,2))
print(df)

          0         1
0  0.375727 -1.297127
1 -0.676528  0.301175
2 -2.236334  0.154765
3 -0.127439  0.415495
4  1.399427 -1.244539
5 -0.884309 -0.108502
6 -0.884931  2.089305
7  0.075599  0.404521
8  1.836577 -0.762597
9  0.294883  0.540444

#数据框的70%

part_70=df.sample(frac=0.7,random_state=10)
print(part_70)

          0         1
8  1.836577 -0.762597
2 -2.236334  0.154765
5 -0.884309 -0.108502
6 -0.884931  2.089305
3 -0.127439  0.415495
1 -0.676528  0.301175
0  0.375727 -1.297127

谢谢您的回复,但我的要求是获取前n%的记录。示例返回随机顺序的行。 - Mohamed Thasin ah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接