Как я могу получить равные или ближайшие значения строки в Pandas? - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь найти строки со значениями столбцов, равными друг другу.Или, может быть, немного отличается от других (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

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Можете ли вы просто посмотреть на стандартное отклонение?

>>> 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 голосов
/ 25 апреля 2018

вы можете конвертировать ваши данные в массив NumPy.npData

затем rowIndex = [iter for iter in range(npData.shape[0]) if np.std(npData[iter,1:]) <= threshold]

что-то в этом роде?вам может потребоваться «нормализация» ваших данных для порогового значения, основанная на стандарте std.

, или использовать zscore from scipy в массиве npData вдоль хорошей оси https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.zscore.html,, а затем использовать этот массив zscored длянайти строки, в которых сумма каждого абсолютного значения столбца равна <= threshold </p>

лучшее решение, которое я нашел, по крайней мере для 2 столбцов, равных:

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

или просто добавить тест, а затем выполнитьnumpy.histogram, чтобы найти, когда хотя бы три или более столбца равны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...