#python #dataframe
Вопрос:
У меня есть фрейм данных, как показано ниже:
A B C a1 b1 c1 a1 b2 c2 a2 b1 c3 a2 b2 c4
Я хочу преобразовать его во что-то вроде:
A B1 a1 c1 a2 c3
или
A B1 B2 a1 c1 c2 a2 c3 c4
Значения в B, которые повторяются, являются именами столбцов, значения которых находятся в столбце C. Я хочу добавить все или некоторые из них в качестве столбцов фрейма данных
На самом деле набор данных создается путем выравнивания дерева, в нем больше столбцов, каждый из которых является внутренним узлом. первый столбец-корень, C — листья
Это некоторые мои попытки:
desired_cols = ["b1","b2"] # desired cols df = main_df[main_df['B'] == "b1"] for c in desired_cols: new_col = main_df[main_df['B'] == c]['C'] df[c] = new_col
Однако это не работает, и новые столбцы не выровнены по вертикали. Он добавляет nan
новые столбцы.
Комментарии:
1. Не могли бы вы объяснить логику, которой вы пытаетесь достичь здесь… это, вероятно, я, но я не вижу, в чем заключается закономерность
2. @JonClements значения в B, которые повторяются, являются именами столбцов,значения которых находятся в столбце C. Я хочу, чтобы они были столбцами фрейма данных.
3. Хорошо… и желаемый результат, безусловно, 4 строки, а не 2? (потому что, если два в порядке — это просто поворот…)
4. Двойки @JonClements — это прекрасно!
5. @JonClements На самом деле набор данных представляет собой сглаженное дерево, в нем больше столбцов, каждый из которых является внутренним узлом. первый столбец-корень, C — листья
Ответ №1:
Попробуй:
df.pivot('A', columns='B')
Вы получите только две строки, но ваши четыре строки все равно дублируются на 2 строки.
A C B b1 b2 0 a1 c1 c2 1 a2 c3 c4
Обновить
Если вы хотите динамически выбрать сводный индекс, вы можете выбрать все столбцы, присутствующие в вашем df, кроме «B» и «C» как таковых:
df2 = df.pivot(index=list(df.columns[~df.columns.isin(['B', 'C'])]), columns='B')
Обновление 2
Если вы хотите создавать только определенные столбцы из значений в B, сначала срежьте фрейм данных:
df2 = df[df.B.isin(desired_cols)].pivot('A', columns='B').reset_index()
Где desired_cols = ['b1']
или desired_cols = ['b1', 'b2']
Комментарии:
1. Ошибка значения: Индекс содержит повторяющиеся записи, не может изменить форму
2. Пожалуйста, дайте общий ответ, это был просто пример… Как я могу указать все остальные столбцы, кроме B и C, в качестве сводных столбцов, если вы это имеете в виду.
3. теперь я попробовал
df = df.pivot(df.columns - ["B","C"], columns='B')
, я получаюValueError: operands could not be broadcast together with shapes (11,) (2,)
4.
df.columns - ['B','C']
не является допустимым способом вычесть «B» и «C» изdf.columns
5. Большое вам спасибо, первое обновление работает, однако для второго, что я должен использовать для «А»? должно ли это быть похоже на обновление 1, исключив столбцы B и C?