Это мои выборочные данные. Данные содержат, 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 столбцов.
Можно ли достичь этого, используя панды.
Я предлагаю создать словарь вместо списков:
#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)'])
{'(6640.83, 679.0)': [1,2 ] # that is first and 4th row of having ID 1 and 2 respectively , '(6648.84, 673.37)': [1, 2]} # that is second and 3rd row of having ID 1 and 2 respectively
.