小编ely*_*ely的帖子

NumPy或Pandas:将数组类型保持为整数,同时具有NaN值

是否有一种首选方法可以将numpy数组的数据类型固定为int(int64或者其他),同时仍然将内部元素列为numpy.NaN

特别是,我正在将内部数据结构转换为Pandas DataFrame.在我们的结构中,我们有整数类型的列仍然有NaN(但列的dtype是int).如果我们把它变成一个DataFrame,它似乎将所有东西重铸为浮点数,但我们真的很喜欢int.

思考?

事情尝试:

我尝试使用from_records()pandas.DataFrame下的函数coerce_float=False,但这并没有帮助.我也尝试使用带有NaN fill_value的NumPy掩码数组,这也没有用.所有这些都导致列数据类型变为浮点数.

python int numpy type-conversion pandas

140
推荐指数
6
解决办法
5万
查看次数

PyDev和Eclipse未解决的导入问题

我是PyDev和Python的新手,尽管我已经使用Eclipse for Java了.我正在尝试通过一些Dive Into Python示例,这感觉就像一个非常微不足道的问题,只是变得非常烦人.我正在使用Ubuntu Linux 10.04.

我希望能够使用位于目录中的文件odbchelper.py /Desktop/Python_Tutorials/diveintopython/py

这是我在PyDev/Eclipse项目中正在处理的example.py文件:

import sys
sys.path.append("~/Desktop/Python_Tutorials/diveintopython/py")
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我希望我的代码的下一行是:

import odbchelper
Run Code Online (Sandbox Code Playgroud)

这会导致每次都无法解决导入错误.我已经将__init__.py文件添加到几乎所有可能的目录中,并没有任何帮助.我尝试__init__.py一次一个地添加文件到项目位置和odbchelper.py文件之间的各级目录,我也尝试将__init__.py文件同时添加到其间的所有目录中.两者都不起作用.

我想要做的就是在其他目录中的某个地方有一个项目,例如/Desktop/MyStuff/Project,我有example.py ...然后从example.py我要从中导入odbchelper.py/Desktop/Python_Tutorials/diveintopython/py/

我可以找到的每个留言板响应只是说使用该sys.path.append()函数将此目录添加到我的路径,然后导入它......但这正是我在我的代码中所做的并且它无法正常工作.

我也尝试过Ctrl- 1技巧来抑制错误信息,但程序仍然无法正常运行.我收到一个错误ImportError: No module named odbchelper.因此,显然没有添加路径,或者存在一些问题,即我添加__init__.py文件的所有排列都错过了.

这件事很简单......从我机器上其他地方存在的某个文件调用东西......这需要付出很多努力.

python pydev python-import

107
推荐指数
6
解决办法
18万
查看次数

使用pandas GroupBy.agg()对同一列进行多次聚合

给出以下(完全矫枉过正的)数据框示例

import pandas as pd
import datetime as dt
df = pd.DataFrame({
         "date"    :  [dt.date(2012, x, 1) for x in range(1, 11)], 
         "returns" :  0.05 * np.random.randn(10), 
         "dummy"   :  np.repeat(1, 10)
})
Run Code Online (Sandbox Code Playgroud)

是否存在将两个不同的聚合函数应用于同一列的现有内置方法,而无需agg多次调用?

语法上错误但直观正确的方法是:

# Assume `function1` and `function2` are defined for aggregating.
df.groupby("dummy").agg({"returns":function1, "returns":function2})
Run Code Online (Sandbox Code Playgroud)

显然,Python不允许重复键.是否还有其他表达输入的方式agg?也许一个元组列表[(column, function)]会更好,允许多个函数应用于同一列?但它似乎只接受一本字典.

除了定义一个仅应用其中的两个函数的辅助函数之外,还有一个解决方法吗?(无论如何,它如何与聚合一起工作?)

python aggregate dataframe pandas pandas-groupby

95
推荐指数
3
解决办法
5万
查看次数

Python Pandas如何将groupby操作结果分配回父数据帧中的列?

我在IPython中有以下数据框,其中每一行都是一个股票:

In [261]: bdata
Out[261]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 21210 entries, 0 to 21209
Data columns:
BloombergTicker      21206  non-null values
Company              21210  non-null values
Country              21210  non-null values
MarketCap            21210  non-null values
PriceReturn          21210  non-null values
SEDOL                21210  non-null values
yearmonth            21210  non-null values
dtypes: float64(2), int64(1), object(4)
Run Code Online (Sandbox Code Playgroud)

我想应用groupby操作来计算"年度"列中每个日期的所有内容的上限加权平均回报.

这按预期工作:

In [262]: bdata.groupby("yearmonth").apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
Out[262]:
yearmonth
201204      -0.109444
201205      -0.290546
Run Code Online (Sandbox Code Playgroud)

但后来我希望将这些值"广播"回原始数据框中的索引,并将它们保存为日期匹配的常量列.

In [263]: dateGrps = bdata.groupby("yearmonth")

In [264]: dateGrps["MarketReturn"] = dateGrps.apply(lambda x: (x["PriceReturn"]*x["MarketCap"]/x["MarketCap"].sum()).sum())
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last) …
Run Code Online (Sandbox Code Playgroud)

python group-by dataframe pandas

66
推荐指数
4
解决办法
6万
查看次数

IPython Notebook会话中的多个目录和/或子目录?

IPython文档页面建议打开几个不同的IPython笔记本会话是与不同目录或子目录中保存的笔记本进行交互的唯一方法,但这在任何地方都没有明确确认.

我面临的情况是,我可能需要与数百种不同的笔记本进行交互,这些笔记本根据不同的属性进行分类并存储在主目录的子目录中.我已将配置文件/main中的主目录(让我们称之为)ipython_notebook_config.py设置为默认目录.

当我启动IPython的笔记本电脑,它确实显示所有已保存的笔记本电脑是内/main(但包含子目录内保存的笔记本电脑/main).

我如何实现一个单独的IPython仪表板,向我展示其中的笔记本,/main 显示子目录,让我扩展一个子目录并从其内容中选择,或只显示所有子目录中的所有笔记本?

通过每次启动IPython的新实例来实现这一点是完全不可能的.

如果我需要这个能力,我愿意修改源代码.这是一种非常基本的功能,我们需要它,而且令人惊讶的是它不仅仅是默认的IPython行为.对于任何数量超过10或15的笔记本电脑,此功能是必需的.

python directory ipython subdirectory

31
推荐指数
1
解决办法
7349
查看次数

Python Pandas:如何在groupby/transform操作中向数据框添加一个全新的列

我想在我的数据中标记一些分位数,并且对于DataFrame的每一行,我希望在名为"xtile"的新列中输入以保存此值.

例如,假设我创建了一个这样的数据框:

import pandas, numpy as np
dfrm = pandas.DataFrame({'A':np.random.rand(100), 
                         'B':(50+np.random.randn(100)), 
                         'C':np.random.randint(low=0, high=3, size=(100,))})
Run Code Online (Sandbox Code Playgroud)

让我们说我编写自己的函数来计算数组中每个元素的五分位数.我有自己的功能,但是例如只需要参考scipy.stats.mstats.mquantile.

import scipy.stats as st
def mark_quintiles(x, breakpoints):
    # Assume this is filled in, using st.mstats.mquantiles.
    # This returns an array the same shape as x, with an integer for which
    # breakpoint-bucket that entry of x falls into.
Run Code Online (Sandbox Code Playgroud)

现在,真正的问题是如何使用transform向数据添加新列.像这样的东西:

def transformXtiles(dataFrame, inputColumnName, newColumnName, breaks):
    dataFrame[newColumnName] = mark_quintiles(dataFrame[inputColumnName].values, 
                                              breaks)
    return dataFrame
Run Code Online (Sandbox Code Playgroud)

然后:

dfrm.groupby("C").transform(lambda x: transformXtiles(x, "A", "A_xtile", [0.2, 0.4, 0.6, 0.8, 1.0]))
Run Code Online (Sandbox Code Playgroud)

问题是上面的代码不会添加新列"A_xtile".它只是保持我的数据框不变.如果我首先添加一个充满虚拟值的列,例如NaN,称为"A_xtile",那么它会 …

python group-by transform dataframe pandas

30
推荐指数
1
解决办法
3万
查看次数

如何在matplotlib/Python中直接将散点图叠加在jpg图像上?

我需要快速绘制jpg帧作为跟踪算法的输出结果.与jpg帧的伴侣是包含简单(x,y)数据的文本文件,其定位正被跟踪的图像目标.我想使用matplotlib绘制jpg图像,然后覆盖(x,y)数据的散点图,该数据从文本文件中读取并存储到Pythonic列表中.下面是将绘制jpg图像的代码,但在我所做的所有matplotlib,scipy和PIL手册和帮助页面的搜索中,我找不到任何解释如何维护此绘图窗口并简单地覆盖散点图图像中各个(x,y)位置的简单标记.任何帮助是极大的赞赏.

import matplotlib.pyplot as plt;
im = plt.imread(image_name);
implot = plt.imshow(im);
plt.show()
Run Code Online (Sandbox Code Playgroud)

python plot overlay image matplotlib

29
推荐指数
3
解决办法
7万
查看次数

Python pip无法找到pyodbc

使用virtualenv并尝试安装pyodbc.我能找到的所有资源都声称这应该非常简单.在完成MySQL等的所有基本安装之后,只需执行以下操作:

pip install pyodbc
Run Code Online (Sandbox Code Playgroud)

但是,我看到一个非常奇怪的错误.它没有(据我所知)与丢失的库有关,并且在谷歌搜索这种错误很长一段时间之后,我根本找不到任何有建设性的东西.

(local-dev)espears@espears-w ~ $ pip install pyodbc
Downloading/unpacking pyodbc
  Could not find any downloads that satisfy the requirement pyodbc
  Some externally hosted files were ignored (use --allow-external pyodbc to allow).
Cleaning up...
No distributions at all found for pyodbc
Storing debug log for failure in /home/espears/.pip/pip.log
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用"allow-external"选项,它没有帮助:

(local-dev)espears@espears-w ~ $ pip install --allow-external pyodbc
You must give at least one requirement to install (see "pip help install")
Run Code Online (Sandbox Code Playgroud)

但帮助文档使我看起来正确使用此选项,例如从运行的输出pip help install:

Package Index Options:

... …
Run Code Online (Sandbox Code Playgroud)

python pip pyodbc

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

在两个迭代器之间获取`std :: string`的子字符串

我有一个程序,预计会将一些选项作为输入,以指定形式(p1,p2,p3,...)中的概率.所以命令行的用法实际上是:

./myprog -dist (0.20, 0.40, 0.40)
Run Code Online (Sandbox Code Playgroud)

我想在C++中解析这样的列表,我目前正在尝试使用std :: string类型的迭代器和Boost提供的split函数.

// Assume stuff up here is OK
std::vector<string> dist_strs; // Will hold the stuff that is split by boost.
std::string tmp1(argv[k+1]);   // Assign the parentheses enclosed list into this std::string.

// Do some error checking here to make sure tmp1 is valid.

boost::split(dist_strs,  <what to put here?>   , boost::is_any_of(", "));
Run Code Online (Sandbox Code Playgroud)

注意上面的<what to put here?>部分.因为我需要忽略开头和结尾的括号,我想做类似的事情

tmp1.substr( ++tmp1.begin(), --tmp1.end() )
Run Code Online (Sandbox Code Playgroud)

但它看起来不像substr这样,我无法在文档中找到有效的功能.

我有一个想法是做迭代器算法,如果这是允许的,并用于substr调用

tmp1.substr( ++tmp1.begin(), (--tmp1.end()) - (++tmp1.begin()) …
Run Code Online (Sandbox Code Playgroud)

c++ string parsing

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

将单个维度添加到NumPy向量的有效方法,以便切片分配起作用

在NumPy中,如何有效地将1-D对象制作成2-D对象,其中单个维度是从当前对象推断出来的(即列表应该是1xlength还是lengthx1向量)?

 # This comes from some other, unchangeable code that reads data files.
 my_list = [1,2,3,4]

 # What I want to do:
 my_numpy_array[some_index,:] = numpy.asarray(my_list)

 # The above doesn't work because of a broadcast error, so:
 my_numpy_array[some_index,:] = numpy.reshape(numpy.asarray(my_list),(1,len(my_list)))

 # How to do the above without the call to reshape?
 # Is there a way to directly convert a list, or vector, that doesn't have a
 # second dimension, into a 1 by length "array" (but really it's still a …
Run Code Online (Sandbox Code Playgroud)

python numpy

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