البيانات الفرعية في بيثون
سؤال
أرغب في استخدام ما يعادل أمر المجموعة الفرعية في R لبعض كود بيثون الذي أكتبه.
ها هي بياناتي:
col1 col2 col3 col4 col5
100002 2006 1.1 0.01 6352
100002 2006 1.2 0.84 304518
100002 2006 2 1.52 148219
100002 2007 1.1 0.01 6292
10002 2006 1.1 0.01 5968
10002 2006 1.2 0.25 104318
10002 2007 1.1 0.01 6800
10002 2007 4 2.03 25446
10002 2008 1.1 0.01 6408
أريد مجموعة البيانات بناءً على محتويات col1
و col2
. (القيم الفريدة في Col1 هي 100002 و 10002 ، وفي Col2 هي 2006،2007 و 2008.)
يمكن القيام بذلك في R باستخدام أمر المجموعة الفرعية ، هل هناك أي شيء مشابه في Python؟
المحلول
على الرغم من أن الإجابات المستندة إلى التكرار جيدة تمامًا ، إذا كنت تعمل مع صفائف Numpy (كما ذكرت أنك) هناك طرق أفضل وأسرع لاختيار الأشياء:
import numpy as np
data = np.array([
[100002, 2006, 1.1, 0.01, 6352],
[100002, 2006, 1.2, 0.84, 304518],
[100002, 2006, 2, 1.52, 148219],
[100002, 2007, 1.1, 0.01, 6292],
[10002, 2006, 1.1, 0.01, 5968],
[10002, 2006, 1.2, 0.25, 104318],
[10002, 2007, 1.1, 0.01, 6800],
[10002, 2007, 4, 2.03, 25446],
[10002, 2008, 1.1, 0.01, 6408] ])
subset1 = data[data[:,0] == 100002]
subset2 = data[data[:,0] == 10002]
هذه العوائد
Subset1:
array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03],
[ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05],
[ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05],
[ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]])
Subset2:
array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03],
[ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05],
[ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03],
[ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04],
[ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]])
إذا لم تكن تعرف القيم الفريدة في العمود الأول مسبقًا ، فيمكنك استخدام أيضًا numpy.unique1d
أو وظيفة بنيت set
للعثور عليهم.
تحرير: لقد أدركت للتو أنك تريد تحديد بيانات حيث لديك مجموعات فريدة من عمودين ... في هذه الحالة ، يمكنك أن تفعل شيئًا كهذا:
col1 = data[:,0]
col2 = data[:,1]
subsets = {}
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)):
subset = data[(col1 == val1) & (col2 == val2)]
if np.any(subset):
subsets[(val1, val2)] = subset
(أنا أقوم بتخزين المجموعات الفرعية كدليل ، مع كون المفتاح عبارة عن مجموعة من المزيج ... هناك بالتأكيد أخرى (والأفضل ، اعتمادًا على ما تفعله) طرقًا للقيام بذلك!)
نصائح أخرى
subset()
في R يشبه إلى حد كبير filter()
في بيثون. كما يلاحظ المرجع ، سيتم استخدام هذا ضمنيًا عن طريق اختصاصات القائمة ، وبالتالي فإن الطريقة الأكثر وضوحًا وواضحة لكتابة الرمز قد تكون
[ item for item in items if item.col2 == 2006 ]
على سبيل المثال ، إذا كانت صفوف البيانات الخاصة بك في حالة تسمى items
.
نظرًا لأنني لست على دراية بـ R ولا كيف يعمل أمر المجموعة الفرعية بناءً على وصفك ، يمكنني أن أقترح عليك إلقاء نظرة على وظيفة مجموعة Itertool. إذا أعطيت وظيفة تقوم بإخراج قيمة ، فيمكنك تشكيل مجموعات بناءً على إخراج هذه الوظيفة. مأخوذ من مجموعة من:
groups = []
uniquekeys = []
data = sorted(data, key=keyfunc)
for k, g in groupby(data, keyfunc):
groups.append(list(g)) # Store group iterator as a list
uniquekeys.append(k)
ثم حصلت على مجموعات فرعية. ومع ذلك ، كن حذرا لأن القيم التي تم إرجاعها ليست قوائم كاملة. إنهم متكررون.
أفترض أن قيمك يتم إرجاعها على أساس كل صف.