Как удалить дубликаты во фрейме данных с помощью Python - PullRequest
0 голосов
/ 06 июня 2018

Таким образом, фрейм данных равен

Product    Price  Weight  Range   Count
   A        40      20      1-3     20
   A        40      20      4-7     23
   B        20      73      1-3     54
   B        20      73      4-7     43
   B        20      73      8-15    34
   B        20      73      >=16    12
   C        10      20      4-7     22

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

Ожидаемый результат

Product    Price  Weight  Range   Count
   A        40      20      1-3     20
                            4-7     23
   B        20      73      1-3     54
                            4-7     43
                            8-15    34
   B        20      73      >=16    12
   C        10      20      4-7     22

или

   Product  Price  Weight  1-3   4-7   8-15  >=16
   A        40      20     20     23   NaN    NaN
   B        20      73     54     43   34     1
   C        10      20      0     22   NaN    NaN                     

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

попробуйте это,

mask=df.duplicated(subset=['Product'])
df.loc[mask,['Product','Price','Weight']]=''

Вывод:

  Product Price Weight Range  Count
0       A    40     20   1-3     20
1                        4-7     23
2       B    20     73   1-3     54
3                        4-7     43
4                       8-15     34
5                       >=16     12
6       C    10    100   4-7     22

.

pd.pivot_table(df,index=['Product','Price','Weight'],columns='Range',values='Count').reset_index()

Вывод:

Range Product  Price  Weight   1-3   4-7  8-15  >=16
0           A     40      20  20.0  23.0   NaN   NaN
1           B     20      73  54.0  43.0  34.0  12.0
2           C     10     100   NaN  22.0   NaN   NaN
0 голосов
/ 06 июня 2018

По моему мнению, первое решение не рекомендуется, если нужны процессы DataFrame позже.

Второе решение намного лучше, и если дубликаты в реальных данных необходимы, агрегированные значения, например, sum:

#convert catagoricals to strings
df['Range'] = df['Range'].astype(str)

df = (df.groupby(['Product', 'Price', 'Weight', 'Range'])['Count']
        .sum()
        .unstack(fill_value=0)
        .reset_index())
print (df)
Range Product  Price  Weight  1-3  4-7  8-15  >=16
0           A     40      20   20   23     0     0
1           B     20      73   54   43    34    12
2           C     10      20    0   22     0     0
0 голосов
/ 06 июня 2018

Выполнение второго вывода имеет больший смысл, чем первый.Используйте set_index, затем unstack.

(df.set_index(['Product', 'Price', 'Weight', 'Range'])
  .Count
  .unstack(fill_value=0)
  .reset_index()
)

Range Product  Price  Weight  1-3  4-7  8-15  >=16
0           A     40      20   20   23     0     0
1           B     20      73   54   43    34    12
2           C     10     100    0   22     0     0
...