Добавьте значения строк в виде новых столбцов во фрейме данных

#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?