#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)
? @yangyang3. 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