小编Dim*_*old的帖子

在pandas中的多索引级别内按列排序

我在下面的示例中有一个排序请求.

我需要reset_index(),然后sort()然后set_index()还是有一个光滑的方式来做到这一点?

l = [[1,'A',99],[1,'B',102],[1,'C',105],[1,'D',97],[2,'A',19],[2,'B',14],[2,'C',10],[2,'D',17]]
df = pd.DataFrame(l,columns = ['idx1','idx2','col1'])
df.set_index(['idx1','idx2'],inplace=True)

# assume data has been received like this...
print df

           col1
idx1 idx2      
1    A       99
     B      102
     C      105
     D       97
2    A       19
     B       14
     C       10
     D       17

# I'd like to sort descending on col1, partitioning within index level = 'idx2'

           col1
idx1 idx2      
1    C      105
     B      102
     A       99
     D       97

2    A       19
     D       17
     B       14
     C       10
Run Code Online (Sandbox Code Playgroud)

谢谢你的回答注意我稍微改变了数据:

l = …
Run Code Online (Sandbox Code Playgroud)

python sorting pandas

23
推荐指数
3
解决办法
9355
查看次数

在pandas中按范围加入/合并的最佳方式

我经常使用范围条件将pandas用于合并(join).

例如,如果有2个数据帧:

A(A_id,A_value)

B(B_id,B_low,B_high,B_name)

它们很大并且大小相同(比如每个2M记录).

我想在A和B之间建立一个内连接,所以A_value将在B_low和B_high之间.

使用SQL语法:

SELECT *
FROM A,B
WHERE A_value between B_low and B_high
Run Code Online (Sandbox Code Playgroud)

这将非常简单,简短而有效.

同时在pandas中唯一的方法(不使用我发现的循环)是在两个表中创建一个虚拟列,连接它(相当于交叉连接),然后过滤掉不需要的行.这听起来沉重而复杂:

A['dummy'] = 1
B['dummy'] = 1
Temp = pd.merge(A,B,on='dummy')
Result = Temp[Temp.A_value.between(Temp.B_low,Temp.B_high)]
Run Code Online (Sandbox Code Playgroud)

我的另一个解决方案是通过使用B[(x>=B.B_low) & (x<=B.B_high)]掩码在B上的每个A值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.

是否有更优雅和/或更有效的方式来执行此操作?

python join numpy pandas

20
推荐指数
2
解决办法
6707
查看次数

从Jupyter笔记本运行交互式命令行代码

Ipython Jupyter Notebook中有一个有趣的选项可以直接从笔记本中执行命令行语句.例如:

! mkdir ...
! python file.py
Run Code Online (Sandbox Code Playgroud)

此外 - 此代码可以使用os以下命令运行:

import os
os.system('cmd command')
Run Code Online (Sandbox Code Playgroud)

但是如何运行交互式shell命令.例如:

!conda install package
Run Code Online (Sandbox Code Playgroud)

可能需要将来的input([Y]/N)或文件夹位置,但不接受进一步的输入.

cmd ipython jupyter

19
推荐指数
3
解决办法
4万
查看次数

结束循环与计数器和条件

在Python中,我可以实现一个带有步进计数器的循环和一个停止条件作为for循环的经典案例:

for i in range(50):
    result = fun(i)
    print(i, result)
    if result == 0: 
        break
Run Code Online (Sandbox Code Playgroud)

fun(x)从整数到整数的任意函数在哪里.

我一直怀疑这是否是编码它的最佳方式(从Python语言,在可读性效率方面)或者更好地将它作为while循环运行:

i = 0
result = 1
while result != 0 and i < 50:
    result = fun(i)
    print(i, result)
    i += 1
Run Code Online (Sandbox Code Playgroud)

哪种方法更好?特别是 - 我担心使用不合适的break陈述.

python loops

12
推荐指数
2
解决办法
5640
查看次数

使用numpy或cython进行高效的成对DTW计算

我试图计算numpy数组中包含的多个时间序列之间的成对距离.请参阅下面的代码

print(type(sales))
print(sales.shape)

<class 'numpy.ndarray'>
(687, 157)
Run Code Online (Sandbox Code Playgroud)

因此,sales包含长度为157的687个时间序列.使用pdist计算时间序列之间的DTW距离.

import fastdtw
import scipy.spatial.distance as sd

def my_fastdtw(sales1, sales2):
    return fastdtw.fastdtw(sales1,sales2)[0]

distance_matrix = sd.pdist(sales, my_fastdtw)
Run Code Online (Sandbox Code Playgroud)

---编辑:尝试没有pdist()-----

distance_matrix = []
m = len(sales)    
for i in range(0, m - 1):
    for j in range(i + 1, m):
        distance_matrix.append(fastdtw.fastdtw(sales[i], sales[j]))
Run Code Online (Sandbox Code Playgroud)

---编辑:并行化内循环-----

from joblib import Parallel, delayed
import multiprocessing
import fastdtw

num_cores = multiprocessing.cpu_count() - 1
N = 687

def my_fastdtw(sales1, sales2):
    return fastdtw.fastdtw(sales1,sales2)[0]

results = [[] for i in range(N)] …
Run Code Online (Sandbox Code Playgroud)

python numpy cython joblib

11
推荐指数
2
解决办法
4620
查看次数

向量化单词时如何处理文本字符串中的数字?

如果我有一个要矢量化的文本字符串,我应该如何处理其中的数字?或者,如果我向神经网络提供数字和单词,我如何将数字保存为数字?

我打算制作一本关于我所有单词的字典(如此处所示).在这种情况下,所有字符串都将成为数字数组.我该如何处理数字字符?如何输出不将单词索引与数字字符混合的向量?

将数字转换为字符串会削弱我为网络提供的信息吗?

nlp word2vec tensorflow word-embedding

6
推荐指数
2
解决办法
2342
查看次数

在Python中使用dask将tqdm与延迟执行结合起来

tqdm并且dask是在Python迭代都惊人的包。在tqdm实现所需的进度条的同时,dask实现了多线程平台,它们都可以使迭代过程更轻松。但是-我很难将它们结合在一起。

例如,以下代码dask使用tqdm.trange进度条在中实现了延迟执行。事实是,由于delayed迅速执行,进度条立即结束,而真正的计算时间工作则在compute零件中完成。

from dask import delayed,compute
from tqdm import trange
from time import sleep

ct = time()
result= []

def fun(x):
    sleep(x)
    return x

for i in trange(10):
    result.append(delayed(fun)(i))

print compute(result)
Run Code Online (Sandbox Code Playgroud)

如何将进度条附加到compute命令的实际执行中?

python dask tqdm

5
推荐指数
2
解决办法
757
查看次数

与熊猫并排的箱线图

我需要对存储在熊猫中的五个变量进行比较dataframe。我从这里使用了一个示例,它起作用了,但是现在我需要更改坐标轴和标题,但是我很难做到这一点。

这是我的数据:

df1.groupby('cls').head()
Out[171]: 
   sensitivity  specificity  accuracy       ppv       auc       cls
0     0.772091     0.824487  0.802966  0.799290  0.863700       sig
1     0.748931     0.817238  0.776366  0.785910  0.859041       sig
2     0.774016     0.805909  0.801975  0.789840  0.853132       sig
3     0.826670     0.730071  0.795715  0.784150  0.850024       sig
4     0.781112     0.803839  0.824709  0.791530  0.863411       sig
0     0.619048     0.748290  0.694969  0.686138  0.713899  baseline
1     0.642348     0.702076  0.646216  0.674683  0.712632  baseline
2     0.567344     0.765410  0.710650  0.665614  0.682502  baseline
3     0.644046     0.733645  0.754621  0.683485  0.734299  baseline
4     0.710077     0.653871 …
Run Code Online (Sandbox Code Playgroud)

python boxplot pandas

5
推荐指数
1
解决办法
3960
查看次数

为 pandas 系列的每个值分配百分位

是否有直接开箱即用的方法为 pandas 系列的每个值分配百分位数?

我通过排名和重新调整来实现此计算,如下所示:

values = pd.Series(np.random.normal(0,1,100))
percentiles = values.rank()/values.shape
Run Code Online (Sandbox Code Playgroud)

例如系列:[0,2,4,2,10,8,6,1]

应该收到百分位数: [0.125, 0.4375, 0.625, 0.4375, 1.0, 0.875, 0.75, 0.25]

然而,我很惊讶没有本地解决方案(例如qcutquantile等等......)

有没有明确的计算方法?

python series percentile pandas

5
推荐指数
1
解决办法
2073
查看次数

将 Python 列表转换为有序的唯一值

我遇到许多任务,需要过滤 python (2.7) 列表以仅保留有序的唯一值。我通常的方法是使用odereddictfrom 集合:

from collections import OrderedDict

ls = [1,2,3,4,1,23,4,12,3,41]

ls = OrderedDict(zip(ls,['']*len(ls))).keys()

print ls
Run Code Online (Sandbox Code Playgroud)

输出是:

[1,2,3,4,23,12,41]

有没有其他最先进的方法可以在Python中做到这一点?

  • 注意 - 输入和输出应如下所示list

编辑- 方法的比较可以在这里找到: https: //www.peterbe.com/plog/uniqifiers-benchmark

同时最好的解决方案是:

def get_unique(seq):
    seen = set()
    seen_add = seen.add
    return [x for x in seq if not (x in seen or seen_add(x))]
Run Code Online (Sandbox Code Playgroud)

python list set ordereddictionary python-2.7

4
推荐指数
1
解决办法
4795
查看次数