小编Joh*_*man的帖子

合并单级MultiIndex

有没有办法在不重置索引的情况下合并MultiIndex的单个级别?

我有一个时间不变值的"静态"表,由ObjectID索引,我有一个时变字段的"动态"表,由ObjectID + Date索引.我想一起加入这些表格.

现在,我能想到的最好的是:

dynamic.reset_index().merge(static, left_on=['ObjectID'], right_index=True)
Run Code Online (Sandbox Code Playgroud)

但是,动态表非常大,我不想为了合并这些值而不得不使用它的索引.

python pandas

28
推荐指数
1
解决办法
2万
查看次数

如果没有重叠,则使用MultiIndex的内部联接会失败

我无法使用"空"内连接来使用MultiIndex.在0.10.1之下,我有:

d1 = pd.DataFrame({
    'i1': [1, 2, 2],
    'i2': [1, 1, 2],
     'a': [10,20,30]}).set_index(['i1', 'i2'])
d2 = pd.DataFrame({
    'i1': [3, 3],
    'i2': [1, 2],
    'b': [40, 50]}).set_index(['i1', 'i2'])
d1.join(d2, how='inner')
Run Code Online (Sandbox Code Playgroud)

这给了我

Exception: Cannot infer number of levels from empty list
Run Code Online (Sandbox Code Playgroud)

这有什么好办法吗?我希望能够预先判断交叉点是否为空,所以我可以避免异常.

python pandas

7
推荐指数
1
解决办法
1157
查看次数

转换MultiIndex时间序列的最有效方法

我有一个由许多堆叠时间序列组成的DataFrame.索引是(poolId,month),其中两者都是整数,"月"是自2000年以来的月数.计算多个变量的一个月滞后版本的最佳方法是什么?

现在,我做了类似的事情:

cols_to_shift = ["bal", ...5 more columns...]
df_shift = df[cols_to_shift].groupby(level=0).transform(lambda x: x.shift(-1))
Run Code Online (Sandbox Code Playgroud)

对于我的数据,这需要我整整60秒才能运行.(我有48k个不同的池,总共718k行.)

我正在从R代码和等效的data.table调用转换它:

dt.shift <- dt[, list(bal=myshift(bal), ...), by=list(poolId)]
Run Code Online (Sandbox Code Playgroud)

只需要9秒就可以运行.(这里"myshift"类似于"function(x)c(x [-1],NA)".)

有没有办法让大熊猫verison能够快速恢复原状?我在0.8.1测试了这个.

编辑:这是一个生成足够接近的数据集的示例,因此您可以了解我的意思:

ids = np.arange(48000)
lens = np.maximum(np.round(15+9.5*np.random.randn(48000)), 1.0).astype(int)
id_vec = np.repeat(ids, lens)
lens_shift = np.concatenate(([0], lens[:-1]))
mon_vec = np.arange(lens.sum()) - np.repeat(np.cumsum(lens_shift), lens)
n = len(mon_vec)
df = pd.DataFrame.from_items([('pool', id_vec), ('month', mon_vec)] + [(c, np.random.rand(n)) for c in 'abcde'])
df = df.set_index(['pool', 'month'])
%time df_shift = df.groupby(level=0).transform(lambda x: x.shift(-1))
Run Code Online (Sandbox Code Playgroud)

我尝试时花了64秒.这个数据的每个系列都从第0个月开始; 实际上,他们都应该在月份np.max(镜头)结束,开始日期比较崎岖,但还不错.

编辑2:这是一些比较R代码.这需要0.8秒.因子80,不好.

library(data.table)
ids <- 1:48000
lens …
Run Code Online (Sandbox Code Playgroud)

pandas

6
推荐指数
1
解决办法
1843
查看次数

我可以在f#中按名称调用函数吗?

有没有办法在F#中按名称调用函数?给定一个字符串,我想从全局命名空间(或者,通常是给定的模块)中获取一个函数值,然后调用它.我已经知道了这个功能的类型.

我为什么要这样做?我正在努力解决没有--eval选项的fsi问题.我有一个脚本文件,定义了许多int - >()函数,我想执行其中一个.像这样:

fsianycpu --use:script_with_many_funcs.fsx --eval "analyzeDataSet 1"
Run Code Online (Sandbox Code Playgroud)

我的想法是编写一个蹦床脚本,如:

fsianycpu --use:script_with_many_funcs.fsx trampoline.fsx analyzeDataSet 1
Run Code Online (Sandbox Code Playgroud)

为了编写"trampoline.fsx",我需要按名称查找函数.

f#

6
推荐指数
1
解决办法
996
查看次数

加入/组/聚合的F#查询?

我怎样才能让F#做到相当于

select a.id, avg(case when a.score = b.score then 1.0 else 0.0 end)
from table1 a join table2 b on a.id = b.id and a.date = b.date
group by a.id
Run Code Online (Sandbox Code Playgroud)

在查询表达式?我想出来了

query {
    for a in db.table1 do
    join b in db.table2 on ((a.id, a.date) = (b.id, b.date))
    groupBy a.id into g
    select (g.Key, ???) }
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚要插入"???"的内容.更糟糕的是,"得分"列可以为空,这使数学变得复杂.

或者,是否有更简单的方法来做到这一点?我对.NET数据库访问不是很熟悉.理想情况下,我只是给它一块SQL,它会解析它,并吐出一些类型的数据.实际上,试图找出简单SQL的非SQL语法非常令人沮丧.

f# f#-3.0

2
推荐指数
1
解决办法
713
查看次数

标签 统计

pandas ×3

f# ×2

python ×2

f#-3.0 ×1