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

1

Это мои выборочные данные. Данные содержат, 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 столбцов.

Можно ли достичь этого, используя панды.

Теги:
pandas
dataframe

1 ответ

1
Лучший ответ

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

#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)'])
  • 1
    Это потрясающе. Огромное спасибо :)
  • 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 .
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню