Как я могу эффективно реплицировать строку панд, меняя только один столбец? - PullRequest
1 голос
/ 21 октября 2019

У меня есть кадр данных, который выглядит следующим образом:

    v1  v2
0   a   A1
1   b   A2,A3
2   c   B4
3   d   A5, B6, B7

Я хочу изменить этот кадр данных так, чтобы любая строка, имеющая более одного значения в столбце v2, реплицировалась для каждого значения в v2. Например, для приведенного выше кадра данных результат выглядит следующим образом:

    v1  v2
0   a   A1
1   b   A2
2   b   A3
3   c   B4
4   d   A5
5   d   B6
6   d   B7

Я смог сделать это с помощью следующего кода:

new_df = pd.DataFrame()
for index, row in df.iterrows():
    if len(row["v2"].split(','))>1:
        row_base = row
        for r in row["v2"].split(','):
            row_base["v2"] = r
            new_df = new_df.append(row_base, ignore_index=True)
    else:
        new_df = new_df.append(row)

однако он крайне неэффективен на большом фрейме данных, и я хотел бы узнать, как сделать это более эффективно.

1 Ответ

2 голосов
/ 21 октября 2019

Pandas решение для версии 0.25+ с Series.str.split и DataFrame.explode:

df = df.assign(v2 = df.v2.str.split(',')).explode('v2').reset_index(drop=True)
print (df)
  v1  v2
0  a  A1
1  b  A2
2  b  A3
3  c  B4
4  d  A5
5  d  B6
6  d  B7

Для более старых версий, а также для перфоманса должно быть лучше с numy:

from itertools import chain

s = df.v2.str.split(',')
lens = s.str.len()
df = pd.DataFrame({
    'v1' : df['v1'].values.repeat(lens),
    'v2' : list(chain.from_iterable(s.values.tolist()))
})
print (df)
  v1  v2
0  a  A1
1  b  A2
2  b  A3
3  c  B4
4  d  A5
5  d  B6
6  d  B7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...