所以我有这个概念的困难*args和**kwargs.
到目前为止,我已经了解到:
*args =参数列表 - 作为位置参数**kwargs = dictionary - 其键成为单独的关键字参数,值成为这些参数的值.我不明白这会对哪些编程任务有所帮助.
也许:
我想输入列表和字典作为函数AND的参数同时作为通配符,所以我可以传递任何参数?
有一个简单的例子来说明如何*args和**kwargs使用?
我发现的教程也使用了"*"和变量名.
是*args和**kwargs刚才占位符或者你使用完全相同*args,并**kwargs在代码中?
我希望以顺序方式对数据框中的财务数据执行我自己的复杂操作.
例如,我使用从Yahoo Finance获取的以下MSFT CSV文件:
Date,Open,High,Low,Close,Volume,Adj Close
2011-10-19,27.37,27.47,27.01,27.13,42880000,27.13
2011-10-18,26.94,27.40,26.80,27.31,52487900,27.31
2011-10-17,27.11,27.42,26.85,26.98,39433400,26.98
2011-10-14,27.31,27.50,27.02,27.27,50947700,27.27
....
Run Code Online (Sandbox Code Playgroud)
然后我做以下事情:
#!/usr/bin/env python
from pandas import *
df = read_csv('table.csv')
for i, row in enumerate(df.values):
date = df.index[i]
open, high, low, close, adjclose = row
#now perform analysis on open/close based on date, etc..
Run Code Online (Sandbox Code Playgroud)
这是最有效的方式吗?鉴于对熊猫速度的关注,我认为必须有一些特殊的函数来迭代遍历值,同时也检索索引(可能通过生成器来节省内存)?df.iteritems遗憾的是,只能逐列迭代.
我正在使用pandas库,我想在df具有n列(n> 0)的数据帧中添加两个新列.
这些新列是将函数应用于数据框中的一列的结果.
要应用的功能如下:
def calculate(x):
...operate...
return z, y
Run Code Online (Sandbox Code Playgroud)
为仅返回值的函数创建新列的一种方法是:
df['new_col']) = df['column_A'].map(a_function)
Run Code Online (Sandbox Code Playgroud)
所以,我想要的,并尝试不成功(*),是这样的:
(df['new_col_zetas'], df['new_col_ys']) = df['column_A'].map(calculate)
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?我没有任何线索扫描文档.
**df['column_A'].map(calculate)返回一个pandas系列,每个项目由一个元组z,y组成.并尝试将其分配给两个dataframe列会产生ValueError.*
我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
我有一个pandas DataFrame , df_test. 它包含一个列'size',表示以字节为单位的大小.我使用以下代码计算了KB,MB和GB:
df_test = pd.DataFrame([
{'dir': '/Users/uname1', 'size': 994933},
{'dir': '/Users/uname2', 'size': 109338711},
])
df_test['size_kb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0, grouping=True) + ' KB')
df_test['size_mb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 2, grouping=True) + ' MB')
df_test['size_gb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 3, grouping=True) + ' GB')
df_test
dir size size_kb size_mb size_gb
0 /Users/uname1 994933 971.6 KB 0.9 MB 0.0 GB
1 /Users/uname2 109338711 106,776.1 KB 104.3 MB …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据我在 github here 中找到的内容创建 SVM 模型,但它一直返回此错误。
Traceback (most recent call last):
File "C:\Users\Me\Documents\#e\projects\Sign-Language-Glove-master\modeling.py", line 22, in <module>
train_features = train[['F1','F2','F3','F4','F5','X','Y','Z','C1','C2']]
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2934, in __getitem__
raise_missing=True)
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1354, in _convert_to_indexer
return self._get_listlike_indexer(obj, axis, **kwargs)[1]
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1161, in _get_listlike_indexer
raise_missing=raise_missing)
File "C:\Python27\lib\site-packages\pandas\core\indexing.py", line 1246, in _validate_read_indexer
key=key, axis=self.obj._get_axis_name(axis)))
KeyError: u"None of [Index([u'F1', u'F2', u'F3', u'F4', u'F5', u'X', u'Y', u'Z', u'C1', u'C2'], dtype='object')] are in the [columns]"
Run Code Online (Sandbox Code Playgroud)
这是我的代码。
import pandas as pd
dataframe= pd.read_csv("lettera.csv", delimiter=',')
df=pd.DataFrame(dataframe) …Run Code Online (Sandbox Code Playgroud) 我正在编写一个代码,它将滚动窗口应用于将返回多列的函数。
输入:Pandas Series
预期输出:3 列 DataFrame
def fun1(series, ):
# Some calculations producing numbers a, b and c
return {"a": a, "b": b, "c": c}
res.rolling('21 D').apply(fun1)
Run Code Online (Sandbox Code Playgroud)
资源内容:
time
2019-09-26 16:00:00 0.674969
2019-09-26 16:15:00 0.249569
2019-09-26 16:30:00 -0.529949
2019-09-26 16:45:00 -0.247077
2019-09-26 17:00:00 0.390827
...
2019-10-17 22:45:00 0.232998
2019-10-17 23:00:00 0.590827
2019-10-17 23:15:00 0.768991
2019-10-17 23:30:00 0.142661
2019-10-17 23:45:00 -0.555284
Length: 1830, dtype: float64
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: must be real number, not dict
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
我有一个pandas数据框,我想在上面使用Apply函数根据现有数据生成两个新列。我收到此错误:
ValueError: Wrong number of items passed 2, placement implies 1
import pandas as pd
import numpy as np
def myfunc1(row):
C = row['A'] + 10
D = row['A'] + 50
return [C, D]
df = pd.DataFrame(np.random.randint(0,10,size=(2, 2)), columns=list('AB'))
df['C', 'D'] = df.apply(myfunc1 ,axis=1)
Run Code Online (Sandbox Code Playgroud)
启动DF:
A B
0 6 1
1 8 4
Run Code Online (Sandbox Code Playgroud)
所需DF:
A B C D
0 6 1 16 56
1 8 4 18 58
Run Code Online (Sandbox Code Playgroud) import pandas as pd
Run Code Online (Sandbox Code Playgroud)
假设我dataframe喜欢这样:
df = pd.DataFrame({"a":range(4),"b":range(1,5)})
Run Code Online (Sandbox Code Playgroud)
它看起来像这样:
a b
0 0 1
1 1 2
2 2 3
3 3 4
Run Code Online (Sandbox Code Playgroud)
以及将X乘以Y的函数:
def XtimesY(x,y):
return x*y
Run Code Online (Sandbox Code Playgroud)
如果我想添加一个新的熊猫系列,我可以这样做:
df["c"] =df.apply( lambda x:XtimesY(x["a"],2), axis =1)
Run Code Online (Sandbox Code Playgroud)
有用 !
现在我要添加多个系列:
我有这个功能:
def divideAndMultiply(x,y):
return x/y, x*y
Run Code Online (Sandbox Code Playgroud)
像这样的东西?:
df["e"], df["f"] = df.apply( lambda x: divideAndMultiply(x["a"],2) , axis =1)
Run Code Online (Sandbox Code Playgroud)
它不起作用!
我希望'e'列接收分区并将'f'乘法列列出来!
注意:这不是我正在使用的代码,但我期待相同的行为.
python ×9
pandas ×8
dataframe ×4
python-2.7 ×2
args ×1
for-loop ×1
iteration ×1
kwargs ×1
performance ×1