#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