Проверьте значения некоторых столбцов между ними в пандах и составьте список идентификаторов, принадлежащих этому столбцу - PullRequest
0 голосов
/ 28 августа 2018

Это мой пример данных. Данные содержат, ID, Север, Восток и другие заголовки в формате кортежа

ID,North,East,"(6640.83, 679.0)","(6648.84, 673.37)","(6649.83, 674.3)","(6647.0, 200.0)"
1,6642.83,679.37,2.0,8.4,8.6,479.38
1,6648.84,673.37,9.7,0.0,1.3,473.3
2,6649.83,674.3,10.1,1.3,1.4,474.3
2,6647.0,200.0,3.03,473.3,474.30,5.0

Моя цель - проверить данные каждой колонки, кроме 'ID','North' and 'East') по каждой строке, и посмотреть, кто имеет минимальное значение. И когда я найду минимальное значение, то я бы хотел написать, что такие значения (только ID) в списке, принадлежащем этому столбцу

например, строка 1 имеет наименьшее значение, принадлежащее столбцу "(6640.83, 679.0)" затем, Я хотел бы составить список

6640.83_679.0 = [1] # here 1 value comes from the ID of that row. 

и это продолжается. Например, строка 4 снова имеет минимальное значение, принадлежащее "(6640.83, 679.0)", затем вместо создания отдельного списка, принадлежащего этому столбцу, я хотел бы использовать тот же созданный список и добавить идентификатор == 2. например. По существу, если список, уже принадлежащий этому столбцу, уже существует, то я не хочу снова создавать другой список, но если список, ранее принадлежавший этому столбцу, еще не создан, я бы хотел создать список, чтобы я мог сохранить значение , Теперь предыдущий список становится таким:

6640.83_679.0 = [1, 2] # value corresponding to first rows and 4th rows of id of 1 and 2
6648.87_673.37 = [1] # value corresponding to second rows but has ID of 1
6649.83_674.3 = [2] # value corresponding to third rows and has ID of 2

Я не хочу использовать np.where и проверять каждый столбец, поскольку возможно, что столбец, который необходимо проверить, может содержать более 50 столбцов.

Можно ли достичь этого с помощью панд?

1 Ответ

0 голосов
/ 28 августа 2018

Я предлагаю создать словарь вместо списков:

#filter only tuples columns
df1 = df.iloc[:, 3:]
print (df1)
   (6640.83, 679.0)  (6648.84, 673.37)  (6649.83, 674.3)  (6647.0, 200.0)
0              2.00                8.4               8.6           479.38
1              9.70                0.0               1.3           473.30
2             10.10                1.3               1.4           474.30
3              3.03              473.3             474.3             5.00

#get positions by min values
s = pd.Series(df1.values.argmin(axis=1) + 1, index=df1.index)
print (s)
0    1
1    2
2    2
3    1
dtype: int64

#get column names (tuples) by min values
m = df1.idxmin(axis=1)
print (m)
0     (6640.83, 679.0)
1    (6648.84, 673.37)
2    (6648.84, 673.37)
3     (6640.83, 679.0)
dtype: object

#create dictioanry of lists
d = s.groupby(m).apply(list).to_dict()
print (d)
{'(6640.83, 679.0)': [1, 1], '(6648.84, 673.37)': [2, 2]}

#for select value of dict (if tuples omit '')
print (d['(6640.83, 679.0)'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...