【问题标题】:Pandas groupby with pd.cut熊猫 groupby 与 pd.cut
【发布时间】:2021-07-16 12:57:43
【问题描述】:

我有以下数据框

chr 列用于染色体编号,pos 用于其中的特定位置。 pos 列按升序排列。我需要将每个染色体分成相等的 100、1000、10000 等箱。例如对于 bin 值 100 chr 1 将被拆分为 bin [0, 100), [100, 200), ... [last position, last position+100)。

所以(可能)我需要先 group_by chr 列,然后在 pos 上使用 pd.cut > 由组中最大 pos 确定的 bin 列。我该怎么做?

我只能找到带有 set bins 的示例,例如

pd.groupby(['chr', pd.cut(df_sorted.pos, bins=100)])

但在我的情况下,我需要通过组最大 pos 值确定最后一个 bin 间隔。

我试过了:

chr_group = df_sorted.groupby(['chr'])

chr_group.apply(lambda grp: pd.cut(grp.pos, bins=pd.interval_range(
    start=0, freq=1000, end=grp.pos.max(), closed='left')))

但这给了我错误 ValueError: Cannot convert non-finite values (NA or inf) to integer

注意:数据集将近3m行,不能使用循环

【问题讨论】:

  • 注意:adding df_sorted.fillna(0, inplace=True) 没有帮助
  • 也许在 lambda 函数的末尾添加 .fillna(0) 会有所帮助?
  • 你的意思是chr_group.apply(lambda grp: pd.cut(grp.pos, bins=pd.interval_range(start=0, freq=1000, end=grp.pos.max(), closed='left'))).fillna(0) chr_group.apply(lambda grp: pd.cut(grp.pos, bins=pd.interval_range(start=0, freq=1000, end=grp.pos.max(), closed='left')).fillna(0))
  • 第二个。但是,如果您添加数据框的文本版本而不是图片也可以。
  • 这样做会得到ValueError: Cannot setitem on a Categorical with a new category, set the categories first

标签: python pandas dataframe data-science


【解决方案1】:

是的,我终于成功了。我需要做的是扩展 bin 间隔边界。该错误是由 bin 间隔未覆盖的最后几行引起的

hr_group = df_sorted.groupby(['chr'])
chr_group.apply(lambda grp: pd.cut(grp.pos, bins=pd.interval_range(
    start=0, freq=1000, end=grp.pos.max()+1000, closed='left')))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-28
    • 2022-07-05
    • 2018-04-23
    • 2022-12-16
    • 2019-02-24
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多