Выбор данных из нескольких столбцов фрейма данных и компиляция в один список

#python #list #dataframe #multiple-columns

Вопрос:

Я новичок в python и связанных с ним библиотеках и самостоятельно копаюсь в лесу синтаксиса, типов данных и т. Д. Я был бы очень признателен за любые советы по следующей проблеме: я пытаюсь выбрать значения из нескольких столбцов («Числа» и «Числы2» в примере ниже) в фрейме данных на основе значения в одном столбце («Буквы»), а затем объединить значения из разных столбцов в один список, чтобы я мог выполнить статистический анализ объединенных значений. После определенного количества проб и ошибок у меня есть следующее, которое, кажется, работает…но кажется немного неуклюжим. Есть ли лучший способ?!

Большое спасибо!

 Letters = ["A","B", "C", "C", "D", "D", "D"]
Numbers =[1,1,1,2,1,2,3]
Numbers2 =[10,10,10,20,10,20,30]

test_dict={"Letter":Letters, "Number":Numbers, "Number2":Numbers2}
test=pd.DataFrame(test_dict)

numbers_by_letters =[]

for unique_letter in test["Letter"].unique(): 
    numbers_by_letter =[]
    for col in range (1, 3) :
        number_by_letter=test[test["Letter"] == unique_letter].iloc[:,col]
        numbers_by_letter.extend(number_by_letter)
    numbers_by_letters.append(numbers_by_letter) 

print (numbers_by_letters)
 

Результат, который я получаю, показан ниже, и я думаю, что хочу этого!

[ [1, 10], [1, 10], [1, 2, 10, 20], [1, 2, 3, 10, 20, 30]]

Комментарии:

1. Можете ли вы описать, как именно вы хотите преобразовать входные данные в выходные? Это трудно понять из вашего кода.

2. Не уверен, что знаю, как ответить на этот вопрос! Входные значения во фрейме данных содержат значения с плавающей точкой, а выходной список списков, показанный внизу, имеет вывод в нужной мне форме. т. е. для каждой уникальной записи в столбце «Буквы» у меня теперь есть простой список значений, связанных с этой записью, скомпилированный из разных столбцов. Это та информация, которая вам нужна? Если нет, объясните медленно, и я попробую и насвер… Спасибо!

Ответ №1:

 print(
    test.groupby("Letter")
    .apply(lambda x: sorted(x[["Number", "Number2"]].to_numpy().flatten()))
    .to_list()
)
 

С принтами:

 [[1, 10], [1, 10], [1, 2, 10, 20], [1, 2, 3, 10, 20, 30]]
 

Комментарии:

1. Круто — спасибо! Ты выводишь меня из моей глубины…. В моей реальной ситуации количество столбцов, из которых я делаю выборку, является переменной, определенной ранее в коде, поэтому я настроил ее со структурой «col в диапазоне». Можно ли изменить ваше решение так, чтобы количество столбцов менялось?

2. @MontagnaBlue Вы можете сделать .apply(lambda x: sorted(x.iloc[:, 0:2].to_numpy().flatten())) примечание .iloc[:, 0:2] , чтобы указать диапазон столбцов.

3. Спасибо — это здорово!