Если у меня есть фрейм данных со столбцами 100s. Как мне выбрать итеративно ниже столбцов.
Один окончательный вывод кадра данных из приведенного ниже кода может быть:
|a | id | year|m2000 | m2001 | m2002 | .... | m2015|
|"hello"| 1 | 2001 | 0 | 0 | 0 | ... | 0 |
|"hello"| 1 | 2015 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2002 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2015 | 0 | 0 | 0 | ... | 0 |
но у другого фрейма данных может быть больше лет, поэтому он будет похож на приведенный ниже пример.
|a | id | year|m2000 | m2001 | m2002 | .... | m2019|
|"hello"| 1 | 2001 | 0 | 0 | 0 | ... | 0 |
|"hello"| 1 | 2015 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2002 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2015 | 0 | 0 | 0 | ... | 0 |
Я не могу использовать drop, так как я бы сбросил 100-е столбцы, поэтому в этом случае лучше выбрать select.
Я пробовал ниже, но говорю, что в этом примере диапазон изменчив.
a=2000
b=2015
for i in range(a, b + 1):
df = df.withColumn("M" + str(i), lit(0))
df = df.select("M" + str(i),"a","id","year")
df.show()
но он показывает только первый год m2000
a | id | year|m2000 |
|"hello"| 1 | 2001 | 0 |
|"hello"| 1 | 2015 | 0 |
|"hello"| 2 | 2002 | 0 |
|"hello"| 2 | 2015 | 0 |
где я хочу это показать
|a | id | year|m2000 | m2001 | m2002 | .... | m2015|
|"hello"| 1 | 2001 | 0 | 0 | 0 | ... | 0 |
|"hello"| 1 | 2015 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2002 | 0 | 0 | 0 | ... | 0 |
|"hello"| 2 | 2015 | 0 | 0 | 0 | ... | 0 |
(1) Вы хотите выбрать все столбцы с «m {год}» или только с 2000 по 2015 год. И (2) можете ли вы утверждать, что эти столбцы всегда присутствуют, или возможно, что иногда столбец отсутствует (например как "м2039").
Интересный вопрос от @remi. Я попытался учесть все сценарии, основываясь на вашей ограниченной информации в моем ответе ниже. Дайте мне знать, если есть варианты, и я помогу
Это всегда будет диапазон как таковой, но интересный момент, если год отсутствует, что происходит. Ответ @wwnde был отличным, спасибо
Вы не совсем понимаете, какие столбцы вам нужны. Если вы хотите выбрать все, что начинается с m
плюс a
, id
, year
, , может оказаться полезным colRegex .
df.select('a','id','year', df.colRegex("`^m200+.+`")).show()
Если вы хотите выборочно выбрать столбцы между 2000 и 2015 годами, используйте понимание списка с оператором моржа следующим образом
df.select('a','id','year', *[c for x in range(2000,2015) if (c:='m'+str(x))in (df.columns)]).show()
Помните, что 2000 и 2015 также могут быть объявлены как переменные и переданы следующим образом.
a=2000
b=2015
df.select('a','id','year', *[c for x in range(a,b) if (c:='m'+str(x))in (df.columns)]).show()
Я не знал о функции colRegex. Довольно крутая функция PySpark! И я думаю, что это именно то, что ищет @lunbox.
передать список столбцов в
select