#python #pandas #list
#питон #pandas #Список
Вопрос:
Я работаю с фреймами данных pandas, где некоторые столбцы имеют отдельные списки в качестве элементов ячеек. Я хочу условно выбрать элементы в каждой ячейке в одном столбце и прочитать соответствующие элементы в списках с тем же индексом в другом столбце (а затем распечатать как другой столбец). Я изо всех сил пытаюсь понять, как это сделать. Чтобы объяснить проблему на примере:
A | B | C | D | |
---|---|---|---|---|
0 | 3.4 | 5.7 | [1,4,2] | [2.5,3.4,1.2] |
1 | 4 | 1.7 | [7,4,5,2] | [12.15,1.2,34.2,67.2] |
Я хочу поставить условие для списков в столбце C (например, выбрать значения> 3) и прочитать соответствующие элементы в столбце D, чтобы распечатать их в столбце E. Это должно дать мне что-то вроде этого:
A | B | C | D | E | |
---|---|---|---|---|---|
0 | 3.4 | 5.7 | [1,4,2] | [2.5,3.4,1.2] | [3.4] |
1 | 4 | 1.7 | [7,4,5,2] | [12.15,1.2,34.2,67.2] | [12.15,1.2,34.2] |
Помощь будет очень признательна.
Ответ №1:
Понимание списка — ваш друг — здесь заархивированные столбцы, а затем во вложенном понимании списка отфильтрованные заархивированные списки:
df['E'] = [[b for a, b in zip(x, y) if a > 3] for x, y in zip(df['C'], df['D'])]
print (df)
A B C D E
0 3.4 5.7 [1, 4, 2] [2.5, 3.4, 1.2] [3.4]
1 4.0 1.7 [7, 4, 5, 2] [12.15, 1.2, 34.2, 67.2] [12.15, 1.2, 34.2]
Или вы можете использовать логическое индексирование с преобразованием списков в массивы numpy:
df['E'] = [list(np.array(y)[np.array(x) > 3]) for x, y in zip(df['C'], df['D'])]
print (df)
A B C D E
0 3.4 5.7 [1, 4, 2] [2.5, 3.4, 1.2] [3.4]
1 4.0 1.7 [7, 4, 5, 2] [12.15, 1.2, 34.2, 67.2] [12.15, 1.2, 34.2]