根据其他列中描述的范围填充数据框列
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
【讨论】:
以上是关于根据其他列中描述的范围填充数据框列的主要内容,如果未能解决你的问题,请参考以下文章
根据每个句子的第一个单词将 pandas 数据框列中的字符串列表分解为新列