我希望能够在Pandas DataFrame中计算数据的描述性统计数据,但我只关心重复的条目.例如,假设我创建了DataFrame:
import pandas as pd
data={'key1':[1,2,3,1,2,3,2,2],'key2':[2,2,1,2,2,4,2,2],'data':[5,6,2,6,1,6,2,8]}
frame=pd.DataFrame(data,columns=['key1','key2','data'])
print frame
key1 key2 data
0 1 2 5
1 2 2 6
2 3 1 2
3 1 2 6
4 2 2 1
5 3 4 6
6 2 2 2
7 2 2 8
Run Code Online (Sandbox Code Playgroud)
如您所见,行0,1,3,4,6和7都是重复的(使用'key1'和'key2'.但是,如果我将这个DataFrame索引如下:
frame[frame.duplicated(['key1','key2'])]
Run Code Online (Sandbox Code Playgroud)
我明白了
key1 key2 data
3 1 2 6
4 2 2 1
6 2 2 2
7 2 2 8
Run Code Online (Sandbox Code Playgroud)
(即,第一行和第二行不会显示,因为它们没有通过重复方法索引为True).
这是我的第一个问题.我的第二个问题涉及如何从这些信息中提取描述性统计数据.暂时忘记丢失的副本,假设我想为重复的条目计算.min()和.max()(这样我就可以得到一个范围).我可以在groupby对象上使用groupby和这些方法,如下所示:
a.groupby(['key1','key2']).min()
Run Code Online (Sandbox Code Playgroud)
这使
key1 key2 data
key1 key2
1 2 1 2 …
Run Code Online (Sandbox Code Playgroud) 我有一个正在迭代的 df,就像这样
for _, row in df.iterrows():
process(row)
Run Code Online (Sandbox Code Playgroud)
函数process接受参数并对其执行 iterrows() 操作。它这样做是因为它通常传递一个数据帧。但是,我想传递一行进行处理并仍然使其正常运行。问题是行是一个系列,而不是一个数据框。并且 Series 不能使用 .iterrows() 方法进行迭代。我尝试将行转换为数据框,如下所示
row = row.to_frame()
但这似乎并没有保留索引、列等。
有没有办法轻松做到这一点?或者我应该重写流程函数以便能够处理单个系列/行?
我正在使用scipy.optimize.minimize进行优化,并尝试使用以下方法:'Newton-CG','dogleg'和'trust-ncg'。据我了解,对于这些方法,需要目标函数的雅可比。但是,该文档建议,如果将jac设置为False,则将对数值进行梯度计算。
所以我试图像这样调用函数:
scipy.optimize.minimize(fun,x0,method='Newton-CG',jac=False,options={'disp':True}
Run Code Online (Sandbox Code Playgroud)
当我打电话给我时,我收到以下错误消息:
File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 1351, in _minimize_newtoncg
raise ValueError('Jacobian is required for Newton-CG method')
Run Code Online (Sandbox Code Playgroud)
这是令人惊讶的,因为我认为我只是将其设置为False(并且如果jac设置为None,则此异常仅在* / optimize.py中发生)。所以我进入/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py并查看功能
def _minimize_newtoncg(fun, x0, args=(), jac=None, hess=None, hessp=None,
callback=None, xtol=1e-5, eps=_epsilon, maxiter=None,
disp=False, return_all=False,
**unknown_options):
Run Code Online (Sandbox Code Playgroud)
在此函数的开头,我编写了以下打印语句:
print (jac)
_check_unknown_options(unknown_options)
print(jac)
if jac is None:
raise ValueError('Jacobian is required for Newton-CG method')
Run Code Online (Sandbox Code Playgroud)
出人意料的是,“无”被打印出来并且不是假的!因此,我看一下调用函数,该函数位于/usr/lib/python2.7/dist-packages/scipy/optimize/_minimize.py中,并且找到将其设置为None的代码片段:
if not callable(jac):
if bool(jac):
fun = MemoizeJac(fun)
jac = fun.derivative
else:
jac = None
Run Code Online (Sandbox Code Playgroud)
因此,为什么将jac设置为“无”是有道理的(尽管它与建议我在原始函数调用中将jac设置为False以获得jacobian数值近似的文档不兼容)。
我想念什么?我是否可以像在Scipy中为我计算雅可比方程的数值近似值那样调用“牛顿-CG”方法?
在Lua中加载模块后,我想确定它对应的模块文件。在 python 中,您可以使用如下代码来执行此操作:
import module_name
module_name.__file__
Run Code Online (Sandbox Code Playgroud)
所以在 Lua 中如果我做类似的事情
require 'math'
Run Code Online (Sandbox Code Playgroud)
接下来我该放什么来确定该模块的位置?顺便说一句,我实际上并不需要 math 的位置,而是下载了一些其他第三方包,并且想知道当我调用 Lua 时实际使用的构建文件的副本。
我想在一个 python 脚本中创建两个独立的 matplotlib 图,并可能在我向各种图中添加线条、注释等时在它们之间来回跳转(例如,也许我调用了一个函数,该函数将线条添加到两个绘图,然后是另一个添加注释的函数)。
我希望通过处理 matplotlib 示例,我能够找出一些有效的解决方案,但我想知道这样做的首选和最干净的方法是什么。我往往对什么时候应该做这样的事情感到困惑
fig,ax=plt.subplots()
Run Code Online (Sandbox Code Playgroud)
什么时候我应该做这样的事情:
fig=plt.figure()
Run Code Online (Sandbox Code Playgroud)
此外,我应该如何在图之间来回切换。如果我做了类似的事情
fig1,ax1=plt.subplots()
fig2,ax2=plt.subplots()
Run Code Online (Sandbox Code Playgroud)
然后我可以通过执行以下操作来引用这些图:
ax1.plt.plot([some stuff])
ax2.plt.plot([otherstuff]
Run Code Online (Sandbox Code Playgroud)
? 我问这个是因为在 matplotlib 示例中,他们通常在调用 plt.subplot() 后不会引用这样的图,而是调用像这样的命令
plt.plot([stuff])
Run Code Online (Sandbox Code Playgroud)
据推测,他们没有指定 ax1 或 ax2 并不重要,因为示例中只有一个图。最后,我想使用类似的方法将两个图都保存到文件中
plt.savefig(....)
Run Code Online (Sandbox Code Playgroud)
尽管我再次需要能够独立参考两个图。那么实现这一点的正确方法是什么?
我在我的site-packages目录中安装了一个基于Python的包.但是,我正在尝试学习代码是如何工作的,所以我想通过输入大量的print语句来破解它,这样我就能理解代码在做什么.但是在一天结束时,我想要一个干净的安装,而不是我的所有黑客.
当然,我可以将原始文件复制到其他地方,制作一些黑客,然后在最后复制所有原始文件.但这真的很乏味.至少,我想安装Python包的本地副本,然后让python脚本优先使用此副本(可能通过脚本顶部的适当语句).但也许这甚至不是进行python开发/黑客攻击的最佳方式.
什么是我的问题的最佳解决方案?我希望能够破解包(并使用该包),但不会弄乱我的干净版本.
假设我有一本这样的字典:
thedict={'1':'the','2':2,'3':'five','10':'orange'}
Run Code Online (Sandbox Code Playgroud)
我想按键对这本字典进行排序。如果我执行以下操作:
for key,value in sorted(thedict.iteritems()):
print key,value
Run Code Online (Sandbox Code Playgroud)
我会得到
1 the
10 orange
2 2
3 five
Run Code Online (Sandbox Code Playgroud)
因为键是字符串而不是整数。我想对它们进行排序,就好像它们是整数一样,因此条目“10,orange”排在最后。我认为这样的事情会起作用:
for key,value in sorted(thedict.iteritems(),key=int(operator.itemgetter(0))):
print key,value
Run Code Online (Sandbox Code Playgroud)
但这产生了这个错误:
TypeError: int() argument must be a string or a number, not 'operator.itemgetter'
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?谢谢!