Дублировать строки в панде, если значения находятся в списке - PullRequest
2 голосов
/ 01 ноября 2019

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

fruit   cost
apples  2
oranges 3
bananas 5
grapefruit  1

Я хочу передать список, который включает в себя указанные значения столбца "fruit", и использовать его для дублирования этих строк в кадре данных. Например, продублировано fruits = ['apples', 'oranges'].

Затем эти строки должны быть скопированы обратно в фрейм данных с дополнительным столбцом, который обозначает, что они являются копией (может быть двоичным 1/0).

Ответы [ 2 ]

3 голосов
/ 01 ноября 2019

Используйте Series.isin для получения совпадающих строк и для дублирования. Используйте DataFrame.append для исходных данных с DataFrame.assign для столбца показателей:

duplicated  = ['apples', 'oranges']
df1 = df[df['fruit'].isin(duplicated)].assign(new=1)
df = df.assign(new=0).append(df1, ignore_index=True)
print (df)
        fruit  cost  new
0      apples     2    0
1     oranges     3    0
2     bananas     5    0
3  grapefruit     1    0
4      apples     2    1
5     oranges     3    1

Другая идея - использовать параметр keys в concat - он создает новый уровень, заполненный 0 и 1, поэтому необходимо DataFrame.reset_indexпо первому уровню для преобразования этого уровня для столбца:

df = (pd.concat([df, df1], keys=(0,1))
       .rename_axis(('new', None))
       .reset_index(level=0)
       .reset_index(drop=True))
print (df)
   new       fruit  cost
0    0      apples     2
1    0     oranges     3
2    0     bananas     5
3    0  grapefruit     1
4    1      apples     2
5    1     oranges     3
0 голосов
/ 01 ноября 2019

Вы можете использовать concat :

result = pd.concat([df, df[df.fruit.isin(fruits)].assign(new=1)], sort=False).fillna(0)

Выход

        fruit  cost  new
0      apples     2  0.0
1     oranges     3  0.0
2     bananas     5  0.0
3  grapefruit     1  0.0
0      apples     2  1.0
1     oranges     3  1.0

В качестве альтернативы вы можете переиндексировать, default_value = 0до конкатета:

filtered = df[df.fruit.isin(fruits)].assign(new=1)

result = pd.concat([df.reindex(columns=filtered.columns, fill_value=0), filtered], sort=False)

print(result)

Выход

        fruit  cost  new
0      apples     2    0
1     oranges     3    0
2     bananas     5    0
3  grapefruit     1    0
0      apples     2    1
1     oranges     3    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...