子样本丰度数据框

时间:2019-08-12 23:15:35

标签: python pandas

我有一个数据框,其中种类作为列,站点作为行。在每个单元格中,是我在该站点看到的每个物种的数量。例如

    Fern1   Fern2   Flower1 Flower2
Site1   15  0   6   1
Site2   0   46  16  40
Site3   25  1   19  3

总= 172 但我想从该数据集中随机抽取100个人进行采样:

    Fern1   Fern2   Flower1 Flower2
Site1   10  0   3   0
Site2   0   26  10  26
Site3   14  0   10  1

(此示例不是随机的,但我想要的是随机的)

所以我开始做

df.stack()
df[df != 0]
Site1   Fern1   15
        Flower1 6
        Flower2 1
Site2   Fern2   46
        Flower1 16
        Flower2 40

这是我需要帮助的部分 现在我想从1:len(count)开始分组 例如


Site1  Fern1  1     1
              2     1
              3     1
              4     1
              ...   ...
              16    1
      Flower1 1     1

这样我就可以使用python示例了。
我发现this,但是完全不能满足我的要求。任何帮助,将不胜感激。由于这是一个非常普遍的问题,所以我尝试着尽可能多地查找,但是有点着急,以为有人可能已经这样做了。

谢谢。

pandas: create a column from 1 to length of each group

result = df.groupby(df.index).transform(lambda x: np.arange(1,len(x)+1))

以上只是在我的专栏中给出了带有原始索引的一堆[1]。

2 个答案:

答案 0 :(得分:0)

尝试看看cumcount

yyy = df.groupby(t.index).cumcount()+1

答案 1 :(得分:0)

好吧,这就是我要做的事情(在将堆叠的df从一系列返回到具有名为“ Counts”的列的df之后):

    d = {}
    for i in df.index:
         x = np.arange(0, df['Counts'].loc[i]) +1
         d[i] = pd.DataFrame([[1]*len(x),], index= [i], columns = x)
         d[i].index = pd.MultiIndex.from_tuples(r[i].index.get_level_values(0))
         d[i] = d[i].stack()

    z = pd.concat(d.values(), axis=0)

虽然这行得通,但效率不是很高,当我尝试对100k行进行采样时会遇到内存错误。有任何建议以这种方式处理巨型文件吗?

感谢所有提供答案的人。我欢迎您的反馈。