我熟悉"矢量化"的概念,以及熊猫如何使用矢量化技术来加速计算.矢量化函数在整个系列或DataFrame上广播操作,以实现比传统迭代数据更大的加速.
但是,我很惊讶地看到很多代码(包括Stack Overflow的答案)提供了解决问题的方法,这些问题涉及使用for循环和列表推导来循环数据.阅读完文档后,对API有了不错的理解,我认为循环是"坏的",并且应该"永远"迭代数组,系列或DataFrame.那么,为什么我会不时地看到用户提出循环解决方案呢?
因此,要总结......我的问题是:
是否for循环真正的"坏"?如果不是,在什么情况下它们会比使用更传统的"矢量化"方法更好?1
1 - 虽然这个问题确实听起来有点宽泛,但事实是,当for循环通常比传统的迭代数据更好时,存在非常具体的情况.这篇文章旨在为后人捕捉这一点.
我注意到从熊猫使用iterrows时性能非常差.
这是其他人经历过的事情吗?它是否特定于iterrows,并且对于特定大小的数据(我正在使用2-3百万行),是否应该避免此功能?
关于GitHub的讨论使我相信它是在数据帧中混合dtypes时引起的,但是下面的简单示例表明它甚至在使用一个dtype(float64)时也存在.我的机器需要36秒:
import pandas as pd
import numpy as np
import time
s1 = np.random.randn(2000000)
s2 = np.random.randn(2000000)
dfa = pd.DataFrame({'s1': s1, 's2': s2})
start = time.time()
i=0
for rowindex, row in dfa.iterrows():
i+=1
end = time.time()
print end - start
Run Code Online (Sandbox Code Playgroud)
为什么矢量化操作如此快速应用?我想也必须有一些逐行迭代.
在我的情况下,我无法弄清楚如何不使用iterrows(这将为将来的问题保存).因此,如果您一直能够避免这种迭代,我将不胜感激.我正在基于单独数据帧中的数据进行计算.谢谢!
---编辑:我想要运行的简化版本已添加到下面---
import pandas as pd
import numpy as np
#%% Create the original tables
t1 = {'letter':['a','b'],
'number1':[50,-10]}
t2 = {'letter':['a','a','b','b'],
'number2':[0.2,0.5,0.1,0.4]}
table1 = pd.DataFrame(t1)
table2 = pd.DataFrame(t2)
#%% Create the body of the …Run Code Online (Sandbox Code Playgroud) 我在这里和那里回答几个问题.我经常测试我和其他人的解决方案有多快.
是否有一个简单的框架来全面了解各种解决方案的速度有多快?
考虑数据帧 df
df = pd.DataFrame({
'Group': list('QLCKPXNLNTIXAWYMWACA'),
'Value': [29, 52, 71, 51, 45, 76, 68, 60, 92, 95,
99, 27, 77, 54, 39, 23, 84, 37, 99, 87]
})
Run Code Online (Sandbox Code Playgroud)
我想总结Value按不同值分组的列Group.我有三种方法可以做到这一点.
import pandas as pd
import numpy as np
from numba import njit
def sum_pd(df):
return df.groupby('Group').Value.sum()
def sum_fc(df):
f, u = pd.factorize(df.Group.values)
v = df.Value.values
return pd.Series(np.bincount(f, weights=v).astype(int), pd.Index(u, name='Group'), name='Value').sort_index()
@njit
def wbcnt(b, w, k):
bins = np.arange(k)
bins = …Run Code Online (Sandbox Code Playgroud) 我想从使用熊猫从雅虎下载的数据创建每日烛台图.在这种情况下,我无法弄清楚如何使用烛台matplotlib函数.这是代码:
#The following example, downloads stock data from Yahoo and plots it.
from pandas.io.data import get_data_yahoo
import matplotlib.pyplot as plt
from matplotlib.pyplot import subplots, draw
from matplotlib.finance import candlestick
symbol = "GOOG"
data = get_data_yahoo(symbol, start = '2013-9-01', end = '2013-10-23')[['Open','Close','High','Low','Volume']]
ax = subplots()
candlestick(ax,data['Open'],data['High'],data['Low'],data['Close'])
Run Code Online (Sandbox Code Playgroud)
谢谢
安德鲁.
如前所述,我在 Python 中创建了一个数据集合(40k 行,5 列),我想将其插入回 SQL Server 表中。
通常,在 SQL 中,我会'select * into myTable from dataTable'调用执行插入操作,但是位于 Pandas 数据帧中的数据显然使这变得复杂。
我并不正式反对使用 SQLAlchemy(尽管更愿意避免再次下载和安装),但更喜欢在 Python 中本地执行此操作,并且我使用 pyodbc 连接到 SSMS。
有没有一种直接的方法可以避免循环(即逐行插入)?
鉴于以下数据框:
df = pd.DataFrame([{'Name': 'Chris', 'Item Purchased': 'Sponge', 'Cost': 22.50},
{'Name': 'Kevyn', 'Item Purchased': 'Kitty Litter', 'Cost': 2.50},
{'Name': 'Filip', 'Item Purchased': 'Spoon', 'Cost': 5.00}],
index=['Store 1', 'Store 1', 'Store 2'])
Run Code Online (Sandbox Code Playgroud)
如何编写脚本以生成以下输出:
[('Store 1', 22.5), ('Store 1', 2.5), ('Store 2', 5.0)]
Run Code Online (Sandbox Code Playgroud) 我正在尝试将pandas数据帧转换为元组列表.但是我在获取元组中的值的索引(即日期)时遇到了困难.我的第一步是去这里,但他们没有为元组添加任何索引.
我唯一的问题是访问numpy数组中每一行的索引.我有一个如下所示的解决方案,但它使用了一个额外的计数器indexCounter,它看起来很草率.我觉得应该有一个更优雅的解决方案来从特定的numpy数组中检索索引.
def get_Quandl_daily_data(ticker, start, end):
prices = []
symbol = format_ticker(ticker)
try:
data = quandl.get("WIKI/" + symbol, start_date=start, end_date=end)
except Exception, e:
print "Could not download QUANDL data: %s" % e
subset = data[['Open','High','Low','Close','Adj. Close','Volume']]
indexCounter = 0
for row in subset.values:
dateIndex = subset.index.values[indexCounter]
tup = (dateIndex, "%.4f" % row[0], "%.4f" % row[1], "%.4f" % row[2], "%.4f" % row[3], "%.4f" % row[4],row[5])
prices.append(tup)
indexCounter += 1
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的帮助!
我有一个像这样的python pandas dataframe df:
a b
1 3
3 6
5 7
6 4
7 8
Run Code Online (Sandbox Code Playgroud)
我想将其转移到列表中:
[(1,3),(3,6),(5,7),(6,4),(7,8)]
Run Code Online (Sandbox Code Playgroud)
谢谢.
pandas ×7
python ×6
iteration ×2
numpy ×2
dataframe ×1
list ×1
performance ×1
pyodbc ×1
python-3.x ×1
sql-server ×1
tuples ×1