以下代码将打印为True,因为Series包含至少一个大于1的元素.但是,它看起来有点像Pythonic.如果一个系列包含一个特定值的数字,是否有更多Pythonic方式返回True?
import pandas as pd
s = pd.Series([0.5, 2])
print True in (s > 1)
Run Code Online (Sandbox Code Playgroud)
真正
编辑:上述答案不仅不是Pythonic,它有时会因某种原因返回错误的结果.例如:
s = pd.Series([0.5])
print True in (s < 1)
Run Code Online (Sandbox Code Playgroud)
假
如何过滤掉所有总份额为 0 的组?
q = session.query(Trades.ticker, func.sum(Trades.shares))
g = q.group_by(Trades.ticker)
f = g.filter(func.sum(Trades.shares) != 0)
result = f.all()
Run Code Online (Sandbox Code Playgroud)
这会在第 3 行引发错误:
... sqlalchemy.exc.OperationalError:(sqlite3.OperationalError) 滥用聚合:sum() ...
解决方法是删除过滤器并使用列表理解:
result = [x for x in g.all() if x[1] != 0.0]
Run Code Online (Sandbox Code Playgroud)
但与过滤 SQL 查询相比,这非常慢,因为它将所有数据加载到内存中,而不是只加载过滤后的数据。
(编辑以简化。)
我发现自己正在对各种[pandas][1]
DataFrame 执行重复性任务,所以我做了一个函数来进行处理.如何修改df
函数process_df(df)
以便调用者看到所有更改(不指定返回值)?
代码的简化版本:
def process_df(df):
df.columns = map(str.lower, df.columns)
df = pd.DataFrame({'A': [1], 'B': [2]})
process_df(df)
print df
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)A B 0 1 2
编辑新代码:
def process_df(df):
df = df.loc[:, 'A']
df = pd.DataFrame({'A': [1], 'B': [2]})
process_df(df)
print df
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)A B 0 1 2
我试图将对象列表转换为嵌套的dict,可以通过索引访问.
以下代码适用于两级嵌套字典.我想将它扩展到灵活地工作任意数量的级别.
from collections import namedtuple
import pprint
Holding = namedtuple('holding', ['portfolio', 'ticker', 'shares'])
lst = [
Holding('Large Cap', 'TSLA', 100),
Holding('Large Cap', 'MSFT', 200),
Holding('Small Cap', 'UTSI', 500)
]
def indexer(lst, indexes):
"""Creates a dynamic nested dictionary based on indexes."""
result = {}
for item in lst:
index0 = getattr(item, indexes[0])
index1 = getattr(item, indexes[1])
result.setdefault(index0, {}).setdefault(index1, [])
result[index0][index1].append(item)
return result
d = indexer(lst, ['portfolio', 'ticker'])
pp = pprint.PrettyPrinter()
pp.pprint(d)
Run Code Online (Sandbox Code Playgroud)
输出:
{'Large Cap': {'MSFT': [holding(portfolio='Large Cap', ticker='MSFT', shares=200)],
'TSLA': …
Run Code Online (Sandbox Code Playgroud) 我使用一个子类内置列表的类.
class Qry(list):
"""Stores a list indexable by attributes."""
def filter(self, **kwargs):
"""Returns the items in Qry that has matching attributes.
Example:
obj.filter(portfolio='123', account='ABC').
"""
values = tuple(kwargs.values())
def is_match(item):
if tuple(getattr(item, y) for y in kwargs.keys()) == values:
return True
else:
return False
result = Qry([x for x in self if is_match(x)], keys=self._keys)
return result
Run Code Online (Sandbox Code Playgroud)
现在我要输入提示:
class C:
a = 1
def foo(qry: Qry[C]):
"""Do stuff here."""
Run Code Online (Sandbox Code Playgroud)
如何在python 3.5+中键入提示自定义容器类?
我试图获取List中字符串的索引号.我尝试了以下代码:
List<string> Markets = new List<string>() {"HKG", "TYO", "NSE", "STU", "FRA", "LON", "SIN", "MIL", "TSE", "ASX", "STO", "AEX", "MEX", "NSE", "EPA", "SWX", "CVE", "BRU", "SWX"};
int index = Markets.FindIndex("HKG");
Run Code Online (Sandbox Code Playgroud)
出现以下错误:
'System.Collections.Generic.List.FindIndex(System.Predicate <string>)'的最佳重载方法匹配有一些无效参数参数1:无法从'string'转换为'System.Predicate <string>'
知道如何让编译器喜欢这段代码吗?
PS我使用的是QuantShare的C#,应该是.Net 2.0
我正在尝试将字符串转换为日期.如果我正确阅读文档,则以下代码应该有效:
import datetime
d = datetime.strptime('January 01, 2015', '%B %d, %Y')
Run Code Online (Sandbox Code Playgroud)
相反,我得到错误:
AttributeError: 'module' object has no attribute 'strptime'
Run Code Online (Sandbox Code Playgroud) 我碰到有namedtuples使用默认参数从一个整洁的方式在这里.
from collections import namedtuple
Node = namedtuple('Node', 'val left right')
Node.__new__.__defaults__ = (None, None, None)
Node()
Run Code Online (Sandbox Code Playgroud)
节点(val =无,左=无,右=无)
如果您希望'right'的默认值为空列表,您会怎么做?您可能知道,使用可变默认参数(例如列表)是否定的.
有没有一种简单的方法来实现它?