【问题标题】:how to get a random sample in a multiindex pandas dataframe?如何在多索引熊猫数据框中获取随机样本?
【发布时间】:2016-01-28 02:06:41
【问题描述】:

我有一个根据以下变量索引的数据框:名称 - 日期。名称是某种奇怪的 ID,而日期是.. 一个日期。

数据非常大,我想检查我拥有的几个随机选择 NAME 的数据。

也就是说,

  1. 从可能的名称中随机选择一个名称
  2. 检查此 NAME 的数据,按时间排序。

我不知道该怎么做。我看到我们可以使用get_level_values,但是我并没有具体的名字,我只是想多次调用随机样本。

任何帮助表示赞赏! 谢谢!

【问题讨论】:

  • 是多索引还是“名称-日期”形式的索引?
  • 多索引df=set_index(['name','date'])

标签: python pandas random-sample


【解决方案1】:
import pandas as pd
import numpy as np
import random
import string

df = pd.DataFrame(data={'NAME': [''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(17)) for _ in range(10)],
            'Date': pd.date_range('1/01/2016', periods=10),
            'Whatever': np.random.randint(20, 50, 10)},
                  columns=['NAME', 'Date', 'Whatever']).set_index(['NAME', 'Date'])

random_df = df[df.index.get_loc(np.random.choice(df.index.levels[0])) == True].sort_index(level=1)
print(random_df)

返回一个看起来像这样的df

                              Whatever
NAME              Date                
xg71zOEQVOEfCZ2ne 2016-01-01        35
qLCXuEerCXi6gmF1Y 2016-01-02        26
0vDe7x8TIb5FRv7hV 2016-01-03        40
Ddc6FGKBdtcLqT53O 2016-01-04        31
IYcrKG9pjt7mHH3qn 2016-01-05        44
lAWObNTC8yXPMY3v5 2016-01-06        49
k90QWdPc5qFSCFi1c 2016-01-07        22
BWQoHo8lUyEwK9Nuf 2016-01-08        42
Xt0bxUerTan0i1eGw 2016-01-09        22
tc7PYCzpyGmYLbnxu 2016-01-10        46

一个看起来像这样的random_df

                              Whatever
NAME              Date                
IYcrKG9pjt7mHH3qn 2016-01-05        44

【讨论】:

    【解决方案2】:

    你可以忘记你的多索引,只使用isinsample

    import random
    df = df.reset_index()
    df[df['NAME'].isin(random.sample(list(df['NAME'].unique()),5))]
    

    【讨论】:

    • 谢谢@maxymoo!就一个问题。您的代码不能完全满足我的需要,对吗? df['NAME'].sample(5)) 只是得到一个随机的 5 行样本,可能包含也可能不包含不同的名称。相反,我想从数据中提取一个名称......并可能保留多索引结构
    • 名字太多而且没有意义(比如 IDigfvruhncfd7654 )。因此需要随机获取其中一个
    猜你喜欢
    • 2023-03-13
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多