我试图从DataFrames中提取数据作为单独的NumPy数组传递给SciPy stats方法。
示例DataFrame:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Mat itt = Mat::zeros( imgThresholded.size(), CV_8UC1 );
itt = imgThresholded*255;
Canny( itt ,itt, 10, 30, 3 );
vector<vector<Point> > contours_poly( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
vector<Rect> boundRect( contours.size() );
imshow("canny", itt);
//CIRCLE HOUGH
//vector<Vec3f> circles;
findContours( itt, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
for( int i = 0; i < contours.size(); i++ )
{
Scalar color = Scalar(255,255,255);
if( contours[i].size() > points )
{approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
minEnclosingCircle( (Mat)contours_poly[i], center[i], radius[i] );
circle( imgOriginal, center[i], (int)radius[i],color, 2, 8, 0 );
}
}
对于6个唯一的userId,我们只想为userId的147,222,389和443为userId numCol
147 1.3
222 2.6
389 5.7
443 1.2
222 2.4
678 2.1
443 1.8
501 2.1
147 1.2
501 3.2
678 1.3
389 2.4
的值提取4个单独的数组。
输出如下:
数组名称147:numCol
数组名称222:array([1.3, 1.2)]
数组名称389:array([2.6, 2.4)]
数组名称443:array([5.7, 2.4)]
我想知道最好的方法是为我想要的userId创建一个列表,然后使用pandas array([1.2, 1.8)]
和NumPy isin
循环使用DataFrame。< / p>
我仔细看过这个类似的question并且它不一样。
答案 0 :(得分:1)
您可以使用类似df[df.userId == 147]
的内容获取与特定userId相对应的行。因此,如果您有一个所需的userIds列表,您可以执行以下操作:
for userId in userIds_to_check:
stats.anderson(df[df.userId == userId].numCol)
(或您要调用的任何函数,而不是anderson
)。请注意,通常您不需要获得简单的numpy数组;你可以在熊猫系列上调用大多数统计函数,它们可以正常工作。如果由于某种原因确实需要简单的numpy数组,则可以执行df[df.userId == userId].numCol.values
。
根据您正在做的事情,您可能只想使用groupby
,这样您就可以将功能映射到每个userId组,例如:
>>> df.groupby('userId').numCol.apply(stats.skew)
userId
147 0.000000e+00
222 0.000000e+00
389 3.954380e-16
443 0.000000e+00
501 -1.251190e-15
678 -8.673617e-16
Name: numCol, dtype: float64
在这里,我通过将stats.skew
应用于每个组,一次性计算每个userId的numCol值的偏度。