كيف يمكنني الحصول على قيم متساوية أو أقرب من صف في الباندا؟

أحاول العثور على صفوف مع قيم العمود تساوي بعضنا البعض. أو ربما تختلف قليلا ثم أخرى (1 ، 0.5 ، وما إلى ذلك) أو حتى على الأقل 2 أعمدة متساوية.

df.head(10)

         a        b        c        d
0  1128.70  1137.00  1121.30  1132.05
1  1130.20  1142.30  1109.10  1114.90
2  1113.40  1127.90  1109.85  1124.55
3  1126.25  1129.30  1111.20  1124.50
4  1124.45  1141.10  1121.00  1137.95
5  1137.90  1141.90  1094.50  1098.25
6  1097.60  1117.00  1095.65  1112.50
7  1111.05  1119.10  1089.85  1092.10
8  1092.75  1097.60  1074.10  1083.75
9  1083.60  1096.05  1079.10  1087.20

في الجدول أعلاه ، أحاول العثور على صفوف ذات قيم مساوية لبعضها البعض (أو قريبة لبعضها البعض). دعنا نقول:

125  1020.50  1020.50  1020.50  1020.50
452  1047.88  1047.88  1046.95  1048.01
0
في الواقع "ن" هو التسامح. لذلك يمكن تغييرها
وأضاف المؤلف Don Coder, مصدر
يمكنك تحديد ما التسامح من أرقام مماثلة؟ فرق من 1 ، 10 ، وما إلى ذلك؟
وأضاف المؤلف Phil Sheard, مصدر

2 إجابة

هل يمكنك فقط النظر إلى الانحراف المعياري؟

>>> import pandas as pd
>>> pd.DataFrame({'a': {0: 1128.7, 1: 1130.2, 2: 1113.4, 3: 1126.25, 4: 1124.45, 5: 1137.9, 6: 1097.6, 7: 1111.05, 8: 1092.75, 9: 1083.6, 125: 1020.5, 452: 1047.88}, 'b': {0: 1137.0, 1: 1142.3, 2: 1127.9, 3: 1129.3, 4: 1141.1, 5: 1141.9, 6: 1117.0, 7: 1119.1, 8: 1097.6, 9: 1096.05, 125: 1020.5, 452: 1047.88}, 'c': {0: 1121.3, 1: 1109.1, 2: 1109.85, 3: 1111.2, 4: 1121.0, 5: 1094.5, 6: 1095.65, 7: 1089.85, 8: 1074.1, 9: 1079.1, 125: 1020.5, 452: 1046.95}, 'd': {0: 1132.05, 1: 1114.9, 2: 1124.55, 3: 1124.5, 4: 1137.95, 5: 1098.25, 6: 1112.5, 7: 1092.1, 8: 1083.75, 9: 1087.2, 125: 1020.5, 452: 1048.01}})

           a        b        c        d
0    1128.70  1137.00  1121.30  1132.05
1    1130.20  1142.30  1109.10  1114.90
2    1113.40  1127.90  1109.85  1124.55
3    1126.25  1129.30  1111.20  1124.50
4    1124.45  1141.10  1121.00  1137.95
5    1137.90  1141.90  1094.50  1098.25
6    1097.60  1117.00  1095.65  1112.50
7    1111.05  1119.10  1089.85  1092.10
8    1092.75  1097.60  1074.10  1083.75
9    1083.60  1096.05  1079.10  1087.20
125  1020.50  1020.50  1020.50  1020.50
452  1047.88  1047.88  1046.95  1048.01

>>> import numpy as np
>>> np.std(df.values, axis=1)

array([  5.70869676,  13.02005664,   7.50120824,   6.92101645,
         8.56084838,  21.84866629,   9.22688836,  12.40707963,
         8.97754142,   6.22217556,   0.        ,   0.42479407])

يمكنك ملاحظة أن صفوف المثالين الأخيرين لديك تحتوي على انحرافات معيارية أقل بكثير ، 0 إذا كانت جميع القيم متساوية. يمكنك الآن مقارنة مقابل الحد الأدنى:

>>> n = 1
>>> np.std(df.values, axis=1) < n

array([False, False, False, False, False, False, False, False, False,
       False,  True,  True], dtype=bool)
0
وأضاف
آسف كنت بعيدا لفترة من الوقت. ولكن كيف يمكنني الحصول على هذه القيم من DataFrame؟ أعني دعنا نقول لقد عينت مجموعة العودة إلى "arr". كيف يمكنني الحصول على صفوف تساوي هذا الصفيف من DataFrame؟
وأضاف المؤلف Don Coder, مصدر
لدي الفكرة. هذا هو الحل الأمثل بالنسبة لي. مليون شكرا!
وأضاف المؤلف Don Coder, مصدر

يمكنك تحويل البيانات الخاصة بك في مجموعة متكتل. npData

then rowIndex = [iter for iter in range(npData.shape[0]) if np.std(npData[iter,1:]) <= threshold]

شئ مثل هذا ؟ قد تحتاج إلى "تطبيع" البيانات الخاصة بك للعتبة على أساس الأمراض المنقولة جنسيا.

or use the zscore from scipy on the npData array along the good axis https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.zscore.html, and then use this zscored array to find rows where the sum of each absolute value of the colomn is <= threshold

أفضل حل وجدته لـ2 عمودين على الأقل:

`from itertools import combinations
 n=2
 test=[]
 for (x1,x2) in combinations(df.values.T,2):
    diff = numpy.where(abs(x1-x2)

أو قم فقط بإلحاق الاختبار ثم قم بعمل numpy.histogram لإيجاد عند وجود ثلاثة أعمدة أو أكثر متساوية

0
وأضاف