我在下面的示例中有一个排序请求.
我需要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) 我经常使用范围条件将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值上应用搜索函数,但它听起来效率低,并且可能需要索引优化.
是否有更优雅和/或更有效的方式来执行此操作?
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)或文件夹位置,但不接受进一步的输入.
在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陈述.
我试图计算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) 如果我有一个要矢量化的文本字符串,我应该如何处理其中的数字?或者,如果我向神经网络提供数字和单词,我如何将数字保存为数字?
我打算制作一本关于我所有单词的字典(如此处所示).在这种情况下,所有字符串都将成为数字数组.我该如何处理数字字符?如何输出不将单词索引与数字字符混合的向量?
将数字转换为字符串会削弱我为网络提供的信息吗?
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命令的实际执行中?
我需要对存储在熊猫中的五个变量进行比较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) 是否有直接开箱即用的方法为 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]
然而,我很惊讶没有本地解决方案(例如qcut,quantile等等......)
有没有明确的计算方法?
我遇到许多任务,需要过滤 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)