根据其他列中描述的范围填充数据框列

Posted

技术标签:

【中文标题】根据其他列中描述的范围填充数据框列【英文标题】:Filling dataframe columns based on ranges described in other columns 【发布时间】:2016-09-30 10:35:06 【问题描述】:

我有一个非常有趣的问题,我有一个类似的数据集,

    id,    start,  end   
    1234    200   400
    1235    300   500
    1236    100   900
    1236    200   1200
    1236    300   1400

主要目标:我想统计每个 id 的并发会话数。

at 100, id:1236 has 1 session running
at 200, id:1236 has 2 sessions
at 300, id:1236 has 3 sessions
...
at 1000m id:1236 has 2 sessions
etc

我的解决方案

将 1 到 1400 列(会话的最小值和最大值)添加到所有行 用 1 填充会话开始值和会话结束值之间的列 然后将用户的所有行相加,得到上述结果。

在熊猫中

df = pd.read_csv(data+fileName,sep="\t",usecols=[0,1,2],names=['id','start','end'])

for i in range(0,1440):
    df[str(i)]=0

print df.columns

我可以添加列并且正在考虑如何在每行的会话开始和结束之间为这些列填充 1。每行可以有不同的会话开始和结束。

任何提示都会有很大帮助。我只是在 pandas 中尝试它,但后来 我必须将它移植到工作节点中没有 pandas 的 Apache pyspark

【问题讨论】:

在 Pandas 中,您也可以这样做:df[(df.start <= t)&(df.end >= t)].groupby("id").count()['start'].reset_index() 其中t 是您想要的时间。只需相应地重命名最后一列。但我不知道这是否可以通过 pyspark 移植。 谢谢@Khris,确实是一个不错的方法。在这里,我必须从 1 循环到 1400 才能得到结果,因此处理器密集型,我的方法看起来内存密集型。 【参考方案1】:

在 Pandas 中,您也可以这样做: df[(df.start <= t)&(df.end >= t)].groupby("id").count()['start'].reset_index()

其中 t 是您想要的时间。只需相应地重命名最后一列。但我不知道这是否可以通过 pyspark 移植。@Khris

【讨论】:

以上是关于根据其他列中描述的范围填充数据框列的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个计算数据框列中 ID 频率的列?

根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列

如何在其他四个数据框的列中检查一个数据框列是不是可用?

在 Pandas 数据框列中填充缺失的日期值

如何访问 pandas 数据框列中的字典元素并对其进行迭代以创建填充有各自值的新列?

Hive:根据特定列中的唯一值填充其他列