我有一个Pandas DataFrame,如下所示:
values max_val_idx
0 np.array([-0.649626, -0.662434, -0.611351]) 2
1 np.array([-0.994942, -0.990448, -1.01574]) 1
2 np.array([-1.012, -1.01034, -1.02732]) 0
df [‘values’]包含固定长度为3个元素的numpy数组
df [‘max_val_idx]包含相应数组的最大值的索引
由于已经给出了每个数组的最大元素的索引,因此提取每个条目的最大值的最有效方法是什么?
我知道数据存储有点傻,但我自己并没有创建它.而且由于我收集了大量数据( – 50GB,数百个以类似方式存储的pickle数据库),我想知道什么是最有效的方法.
到目前为止,我试图遍历df [‘max_val_idx]的每个元素,并将其用作df [‘values’]中找到的每个数组的索引:
max_val = []
for idx, values in enumerate(df['values']):
max_val.append(values[int(df['max_val_idx'].iloc[idx])])
有没有更快的替代方案?
解决方法:
我会忘记’max_val_idx’列.我不认为它节省了时间,实际上更多的是语法上的痛苦.样本数据:
df = pd.DataFrame({ 'x': range(3) }).applymap( lambda x: np.random.randn(3) )
x
0 [-1.17106202376, -1.61211460669, 0.0198122724315]
1 [0.806819945736, 1.49139051675, -0.21434675401]
2 [-0.427272615966, 0.0939459129359, 0.496474566...
你可以像这样提取最大值:
df.applymap( lambda x: x.max() )
x
0 0.019812
1 1.491391
2 0.496475
但一般来说,如果每个细胞有一个数字,生活会更容易.如果每个单元格都有一个长度为3的数组,则可以重新排列如下:
for i, v in enumerate(list('abc')): df[v] = df.x.map( lambda x: x[i] )
df = df[list('abc')]
a b c
0 -1.171062 -1.612115 0.019812
1 0.806820 1.491391 -0.214347
2 -0.427273 0.093946 0.496475
然后做一个标准的熊猫操作:
df.apply( max, axis=1 )
x
0 0.019812
1 1.491391
2 0.496475
不可否认,这并不比上面容易得多,但总体而言,这种形式的数据更容易使用.
标签:python,pandas,numpy 来源: https://codeday.me/bug/20190823/1702111.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。