Получите весь фрейм данных для каждого отдельного значения в списке

#python

Вопрос:

В настоящее время у меня есть список идентификаторов и фрейм данных с двумя столбцами.

 list = ['id1', 'id2', 'id3']  df = A B  0 A1 B1  1 A2 B2  2 A3 B3  

Я хотел бы получить фрейм данных со столбцами A и B из df для каждого значения в списке.

Пример:

 id A B 0 id1 A1 B1 1 id1 A2 B2 2 id1 A3 B3 3 id2 A1 B1 4 id2 A2 B2 5 id2 A3 B3 6 id3 A1 B1 7 id3 A2 B2 8 id3 A3 B3  

Кто-нибудь может помочь?

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

1. ты что — нибудь пробовал? вы посмотрели, как объединить фреймы данных? вы посмотрели, как создавать новые столбцы? вы знакомы с for циклами в python?

Ответ №1:

IIUC, попробуй с pandas.concat :

 lst = ["id1", "id2", "id3"]  gt;gt;gt; pd.concat({l: df for l in lst}).droplevel(1).reset_index().rename(columns={"index": "id"})   id A B 0 id1 A1 B1 1 id1 A2 B2 2 id1 A3 B3 3 id2 A1 B1 4 id2 A2 B2 5 id2 A3 B3 6 id3 A1 B1 7 id3 A2 B2 8 id3 A3 B3  

Или с pandas.concat и numpy.repeat :

 import numpy as np  gt;gt;gt; pd.concat([df]*len(lst),ignore_index=True).assign(id=np.repeat(lst, df.shape[0]))   A B id 0 A1 B1 id1 1 A2 B2 id1 2 A3 B3 id1 3 A1 B1 id2 4 A2 B2 id2 5 A3 B3 id2 6 A1 B1 id3 7 A2 B2 id3 8 A3 B3 id3  

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

1. Большое спасибо. Это работает, когда длина списка совпадает с количеством строк в кадре данных. Если в списке есть 4-й идентификатор, я получаю ошибку: Несоответствие длины: Ожидается 12 строк, получен массив длиной 16

2. @Cookye — Отредактировал мой ответ. Это должно работать независимо от того,

3. Неважно, я все понял. Код должен быть pd.concat([df]*len(lst)).set_index(np.repeat(lst, len(df))). Большое спасибо

Ответ №2:

Другой способ сделать это :

 df = pd.DataFrame({"A": ["A1", "A2", "A3"], "B": ["B1", "B2", "B3"]}) df_id = pd.DataFrame(["id1", "id2", "id3"], columns=["id"]) df_id["key"] = 1 df["key"] = 1  

Затем объединитесь по ключу:

 df = df.merge(df_id, on="key").drop(["key"], axis=1)  

Вы получаете :

 Output:   A B id 0 A1 B1 id1 1 A1 B1 id2 2 A1 B1 id3 3 A2 B2 id1 4 A2 B2 id2 5 A2 B2 id3 6 A3 B3 id1 7 A3 B3 id2 8 A3 B3 id3