我有一只DataFrame熊猫:
import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df
Run Code Online (Sandbox Code Playgroud)
输出:
c1 c2
0 10 100
1 11 110
2 12 120
Run Code Online (Sandbox Code Playgroud)
现在我想迭代这个帧的行.对于每一行,我希望能够通过列的名称访问其元素(单元格中的值).例如:
for row in df.rows:
print row['c1'], row['c2']
Run Code Online (Sandbox Code Playgroud)
是否有可能在熊猫中做到这一点?
我发现了类似的问题.但它没有给我我需要的答案.例如,建议使用:
for date, row in df.T.iteritems():
Run Code Online (Sandbox Code Playgroud)
要么
for row in df.iterrows():
Run Code Online (Sandbox Code Playgroud)
但我不明白row对象是什么以及如何使用它.
我有一个SQL查询的以下DataFrame:
(Pdb) pp total_rows
ColumnID RespondentCount
0 -1 2
1 3030096843 1
2 3030096845 1
Run Code Online (Sandbox Code Playgroud)
我想像这样转动它:
total_data = total_rows.pivot_table(cols=['ColumnID'])
(Pdb) pp total_data
ColumnID -1 3030096843 3030096845
RespondentCount 2 1 1
[1 rows x 3 columns]
total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]
{3030096843: 1, 3030096845: 1, -1: 2}
Run Code Online (Sandbox Code Playgroud)
但我想确保将303列作为字符串而不是整数进行转换,以便我得到:
{'3030096843': 1, '3030096845': 1, -1: 2}
Run Code Online (Sandbox Code Playgroud) 我注意到从熊猫使用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) i=np.arange(1,4,dtype=np.int)
a=np.arange(9).reshape(3,3)
Run Code Online (Sandbox Code Playgroud)
和
a
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
a[:,0:1]
>>>array([[0],
[3],
[6]])
a[:,0:2]
>>>array([[0, 1],
[3, 4],
[6, 7]])
a[:,0:3]
>>>array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
Run Code Online (Sandbox Code Playgroud)
现在我想对数组进行矢量化以将它们一起打印出来.我试试
a[:,0:i]
Run Code Online (Sandbox Code Playgroud)
要么
a[:,0:i[:,None]]
Run Code Online (Sandbox Code Playgroud)
它给出了TypeError:只有整数标量数组可以转换为标量索引
向量化代码是一个好主意吗?在什么时候这样做有什么好的做法?下面会发生什么?
如果给出的红色,绿色和蓝色值范围为0-255,那么获得色调值的最快计算是什么?该公式将以30fps(每秒920万次)用于640x480图像的每个像素,因此每一点速度优化都有帮助.
我见过其他公式,但我不满意他们涉及多少步骤.我正在寻找一个实际的公式,而不是内置的库函数.
我需要实现前缀和算法,并且需要它尽可能快.例如:
[3, 1, 7, 0, 4, 1, 6, 3]
Run Code Online (Sandbox Code Playgroud)
有没有办法使用SSE/mmx/SIMD cpu指令执行此操作?
我的第一个想法是递归并行地对每一对求和,直到所有的总和都计算如下!
[3, 4, 11, 11, 15, 16, 22, 25]
Run Code Online (Sandbox Code Playgroud)
为了使算法更清晰,"z"不是最终的输出
而是用来计算输出
//in parallel do
for (int i = 0; i < z.length; i++) {
z[i] = x[i << 1] + x[(i << 1) + 1];
}
Run Code Online (Sandbox Code Playgroud) 说我在MATLAB中有以下内容:
a(1).b.c = 4;
a(2).b.c = 5;
a(3).b.c = 7;
....
Run Code Online (Sandbox Code Playgroud)
我想[4 5 7 ...]在单个数组中收集值,无需循环并以矢量化方式.
我试过了:
>> a(:).b.c
# Error: Scalar index required for this type of multi-level indexing.
Run Code Online (Sandbox Code Playgroud)
和
>> a.b.c
# Error: Dot name reference on non-scalar structure.
Run Code Online (Sandbox Code Playgroud)
但他们没有工作.我能想到的最好的是:
arrayfun(@(x) x.b.c, a);
Run Code Online (Sandbox Code Playgroud)
但据我所知arrayfun,没有矢量化,或者是它?
我得到了一个小写字符数组(最多 1.5Gb)和一个字符 c。我想使用 AVX 指令查找字符 c 出现了多少次。
unsigned long long char_count_AVX2(char * vector, int size, char c){
unsigned long long sum =0;
int i, j;
const int con=3;
__m256i ans[con];
for(i=0; i<con; i++)
ans[i]=_mm256_setzero_si256();
__m256i Zer=_mm256_setzero_si256();
__m256i C=_mm256_set1_epi8(c);
__m256i Assos=_mm256_set1_epi8(0x01);
__m256i FF=_mm256_set1_epi8(0xFF);
__m256i shield=_mm256_set1_epi8(0xFF);
__m256i temp;
int couter=0;
for(i=0; i<size; i+=32){
couter++;
shield=_mm256_xor_si256(_mm256_cmpeq_epi8(ans[0], Zer), FF);
temp=_mm256_cmpeq_epi8(C, *((__m256i*)(vector+i)));
temp=_mm256_xor_si256(temp, FF);
temp=_mm256_add_epi8(temp, Assos);
ans[0]=_mm256_add_epi8(temp, ans[0]);
for(j=1; j<con; j++){
temp=_mm256_cmpeq_epi8(ans[j-1], Zer);
shield=_mm256_and_si256(shield, temp);
temp=_mm256_xor_si256(shield, FF);
temp=_mm256_add_epi8(temp, Assos);
ans[j]=_mm256_add_epi8(temp, ans[j]);
}
}
for(j=con-1; j>=0; …Run Code Online (Sandbox Code Playgroud) 在查看x86/x64架构中的寄存器表之后,我注意到有128,256和512位寄存器的整个部分,我从未见过它们用于汇编或反编译的C/C++代码: XMM(0-15)表示128,YMM(0-15)表示256,ZMM(0-31)512.
做了一些挖后我所收集的是,你必须使用2个64位操作,以一个128位的数字进行的,而不是使用通用的数学,add,sub,mul,div操作.如果是这种情况,那么具有这些扩展寄存器集的用途究竟是什么,是否有任何汇编操作可以用来操作它们?