我正在 pandas 中进行一些计算,并且 .loc 方法产生了意外的结果。不确定是我滥用语法还是错误。
df = pd.DataFrame(index=['series1', 'series2', 'series3'])
df['prev value/unit'] = [99,99,99]
df['value'] = [100,100,100]
df['units'] = [100,100,0]
df['value/unit'] = df['value']/df['units']
Run Code Online (Sandbox Code Playgroud)
创建一个数据框,其中会有一些除零值,如下所示。业务逻辑规定,如果存在 /0,则应使用先前的值/单位。
prev value/unit value units value/unit
series1 99 100 100 1.000000
series2 99 100 100 1.000000
series3 99 100 0 inf
Run Code Online (Sandbox Code Playgroud)
所以添加:
df.loc[df.units == 0, 'value/unit'] = df['prev value/unit']
Run Code Online (Sandbox Code Playgroud)
达到了预期的效果,上面的 inf 被 99(之前的单位值)正确覆盖。
但是如果没有div/0。
df.loc[df.units == 0, 'value/unit']
#is a empty Series
#Series([], name: value/unit, dtype: float64)
Run Code Online (Sandbox Code Playgroud)
并且分配df['prev value/unit']给它会覆盖所有值!!!!
所以例如
df = pd.DataFrame(index=['series1', 'series2', …Run Code Online (Sandbox Code Playgroud) 我正在使用脚本进行一些处理,并且当前正在使用固定目录来执行此文件操作.我想使用tempfile模块的tempdir以更优雅的方式执行此操作.
使用以下代码:
import os
import tempfile
#define the location of 'mytemp' parent folder relative to the system temp
sysTemp = tempfile.gettempdir()
myTemp = os.path.join(sysTemp,'mytemp')
#You must make sure myTemp exists
if not os.path.exists(myTemp):
os.makedirs(myTemp)
Run Code Online (Sandbox Code Playgroud)
在我的Mac上它创建了一个文件夹:/ var/folders/nn/zyl78zb .....在PC上它创建了一个(我的用户目录中的隐藏文件夹).
从tempfile模块文档我明白,如果你创建一个tempdir,你必须自己清除它.有时我想去查看中间文件,所以我不想自动删除它们. 如果我离开它们,操作系统最终会清理这些目录(重启后等)? 如果我不直接从脚本中清除它们,下面的运行可能会得到一个不同的tempdir.这最终可能导致大量未使用和不需要的文件.
我已经搜索了tempfile文档,但似乎无法找到答案.这可能是一个操作系统问题,但有临时文件模块经验的人应该知道.
设置实例变量
我有两个清单:
var_names = ['var1', 'var2', 'var3']
var_values = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
也可以是字典:
dict = {'var1': 1, 'var2':2, 'var3':3}
Run Code Online (Sandbox Code Playgroud)
我实际上是从 pandas 那里获取它们的,但是从那里到 dict 是通用且简单的。
这些实例变量列表的长度不断变化,但作为类实例化的一部分,我想将它们添加到实例变量中。例如对于上面给出的列表
self.var1 = var_values[0]
self.var2 = var_values[1]
self.var3 = var_values[2]
Run Code Online (Sandbox Code Playgroud)
如果变量名称和值位于字典中,则可以具有类似的代码。我想我大约一年前使用过setattr,但现在我无法弄清楚。任何指点。只需使用搜索即可找到垃圾邮件
我有一个看起来像这样的数据框:
df = pd.DataFrame(index= pd.date_range('2014-01-01', periods=10))
df['date'] = df.index.map(lambda x: x.strftime('%d-%m-%Y'))
df['date'] = df.index
df['profit']= rand(10)
df['perf_period_id']=2
Run Code Online (Sandbox Code Playgroud)
还有一个 sqlite3 db 和一个名为 fee_profit 的表
费用_利润有 4 个字段:
当我尝试将数据帧写入数据库时(不显示数据库连接):
df.to_sql(name='fee_profit', index=False, con=db, if_exists='append')
Run Code Online (Sandbox Code Playgroud)
我得到以下代码:
252 else:
253 data = [tuple(x) for x in frame.values.tolist()]
--> 254 cur.executemany(insert_query, data)
255
256
InterfaceError: Error binding parameter 0 - probably unsupported type.
Run Code Online (Sandbox Code Playgroud)
没有传递主键(这可能是问题吗?)我把桌子弄得乱七八糟,看起来肯定是日期有问题。尝试了在索引中传递日期的各种组合,也是字符串,没有任何效果。
知道我哪里出错了。无法在任何地方找到使用此方法的示例。
使用 Pandas 0.13.1 和 sqlite 3 2.6.0。数据库是通过 …
一般问题,但我已经使用熊猫超过一年了,当我在pandas DataFrame列中混合类型时,我一直遇到麻烦.我经常会有一个像这样的DataFrame:
df2 =
0 1 2 3 4
val_str test test test test test
val_date 2014-01-15 2014-01-15 2014-01-15 2014-01-15 2014-01-15
val_float 1.5 1.5 1.5 1.5 1.5
val_int 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
作为示例生成:
import pandas as pd
import datetime
df = pd.DataFrame(index=range(5))
df['val_str'] = "test"
df['val_date']= datetime.datetime(2014,1,15)
df['val_bool'] = True
df['val_float'] = 1.5
df['val_int'] = 1
df2=df.T
Run Code Online (Sandbox Code Playgroud)
令人费解的例子,但数据来自excel,csv等,并且很多时候行具有一致的数据类型而不是列.
Pandas似乎(大多数情况下)使用这种数据来处理它的方法,但是在选择或尝试对数据进行布尔运算时,我经常得到意想不到的结果.
用例如选择数据
df2[2]['val_bool'] #eems to work without problem
Run Code Online (Sandbox Code Playgroud)
似乎工作得很好,甚至用例如:
df2.ix['val_bool'] # works fine
Run Code Online (Sandbox Code Playgroud)
似乎按预期工作.尝试使用此切片进一步选择数据时,我经常遇到问题.
df2.ix['val_bool'].dtype
>>> dtype('O')
# trying boolean operations …Run Code Online (Sandbox Code Playgroud)