[英]R with function in python
在R
,我可以使用with(obj, a + b + c + d)
而不是obj$a + obj$b + obj$c + obj$d
,其中obj
可以是list
或data.frame
。
在python中有沒有類似的dict
, pandas.Series
, pandas.DataFrame
函數?
在某種程度上,沒有。 但是有很多有些類似的選擇。 R的with
函數似乎非常通用,因此在Python中必須逐個替換它。
您可以將itemgetter()
用於簡單集合:
In [1]: d = dict(a=1, b=2, c=3, d=4)
In [2]: from operator import itemgetter
In [3]: sum(itemgetter('a', 'b', 'c', 'd')(d))
Out[3]: 10
或attrgetter()
,再次簡單,對象:
In [4]: from collections import namedtuple
In [5]: from operator import attrgetter
In [8]: sum(attrgetter('a', 'b', 'c', 'd')(
namedtuple('sdf', 'a b c d')(1, 2, 3, 4)))
Out[8]: 10
Pandas的DataFrame
支持直接訪問特定列並對其應用操作。 求和是一個簡單的例子,因為它具有以下功能:
In [10]: df = pd.DataFrame({'A': range(10), 'B': range(10), 'C': range(10)})
In [21]: df[['A', 'B']].sum(axis=1) # row sums
Out[21]:
0 0
1 2
2 4
3 6
4 8
5 10
6 12
7 14
8 16
9 18
dtype: int64
還有DataFrame.eval
,它與您所追求的最接近,我認為:
在調用DataFrame實例的上下文中計算表達式。
In [9]: df.eval('(A + B) ** C')
Out[9]:
0 1
1 2
2 16
3 216
4 4096
5 100000
6 2985984
7 105413504
8 4294967296
9 198359290368
dtype: int64
並不是的。 當涉及到這種事情時,R和Python有着截然不同的哲學 - 在R中,可以編寫一個函數,在它們被評估之前解析其參數的整個語法,而在Python中它不是。 所以在Python中,這是不可能的:
df = pd.DataFrame({'a':[1,2],'b':[3,4],'c':[5,6],'d':[7,8]})
with(df, a + b + c)
但是,這有效:
sum(map(df.get, ('a','b','c'))) # gives Series([9,12])
如果您想應用其他鏈式操作,可以實現以下類似的支持:
def chain(op, df, name, *names):
res = df[name]
while names:
res = op(res, df[names[0]])
names = names[1:]
return res
然后你可以這樣做:
from operator import div
chain(div, df, 'a', 'b', 'c')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.