Как объединить несколько столбцов в один столбец?

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня есть эта таблица:

 a   b   c   d    e    f   19-08-06   19-08-07   19-08-08   g    h    i
1   2   3   4    5    6      7         8           9      10    11   12
 

У меня 34 столбца даты, поэтому я хочу объединить столбцы даты только в один столбец.

Как я могу сделать это в pyhton?

Заранее спасибо

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

1. Не могли бы вы определить желаемый результат?

Ответ №1:

Вы можете использовать pd.Series.fullmatch для создания логической маски для извлечения столбцов даты, а затем использовать df.melt

 m = df.columns.str.fullmatch("d{2}-d{2}-d{2}")
cols = df.columns[m]

df.melt(value_vars=cols, var_name='date', value_name='vals')

       date  vals
0  19-08-06     7
1  19-08-07     8
2  19-08-08     9
 

Если вы хотите расплавить, сохранив другие столбцы, попробуйте это.

 df.melt(
    id_vars=df.columns.difference(cols), var_name="date", value_name="vals"
)

  a  b  c  d  e  f   g   h   i      date  vals
0  1  2  3  4  5  6  10  11  12  19-08-06     7
1  1  2  3  4  5  6  10  11  12  19-08-07     8
2  1  2  3  4  5  6  10  11  12  19-08-08     9
 

Здесь я не использовал value_vars=cols , поскольку это делается неявно

 value_vars: tuple, list, or ndarray, optional
   Column(s) to unpivot. If not specified, uses all columns that are 
   not set as id_vars. 

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

1. спасибо вам! Я попробовал, но я получил ошибку, когда я определил «m». Ошибка гласила: невозможно замаскировать не булевым массивом, содержащим значения NA / NaN. Как это исправить?

2. Каков результат print(m) ? @yangyang

3. I got: Index([False, False, False, False, False, False, False, False, False, False, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, False, False, False, False, False, False, False, False], dtype=’object’)

4. это потому, что моя дата в этом формате: 2019-08-13 00:00:00?

5. Затем замените .fullmatch на .match @yangyang