Как удалить повторяющиеся строки одного столбца в пандах при объединении значений остальных столбцов? - PullRequest
1 голос
/ 02 июня 2019

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

0 A B C D E F G H I J K L
1 x 0 1 1 2 1 3 1 2 3 3 4
2 x 1 0 0 0 0 0 0 0 0 0 0
3 y 0 4 5 1 1 2 1 3 4 5 3
4 y 1 0 0 0 0 0 0 0 0 0 0
5 z 1 0 0 0 0 0 0 0 0 0 0

Если B имеет значение, остальные столбцы не имеют значения, а остальные столбцы имеют значения, а B - нет. Значения никогда не равны NaN, они всегда равны 0.0.

Мой ожидаемый результат будет:

0 A B C D E F G H I J K L
1 x 1 1 1 2 1 3 1 2 3 3 4
2 y 1 4 5 1 1 2 1 3 4 5 3
3 z 1 0 0 0 0 0 0 0 0 0 0

Я следил за ответами на несколько похожих вопросов здесь. Я пытался groupby(A).agg('sum') Попробовал ответ на этот и несколько других. Результат всегда одинаков, возвращенный фрейм данных все еще имеет дубликаты, и значения не суммируются, Edit: или значения полностью удаляются.

Пример кадра данных, с которым у меня возникла проблема:

{'Higher managerial administrative and professional occupations': [0.0,
  2332.0,
  0.0,
  240.0,
  0.0],
 'Intermediate occupations': [0.0, 538.0, 0.0, 670.0, 0.0],
 'Lower managerial administrative and professional occupations': [0.0,
  2098.0,
  0.0,
  733.0,
  0.0],
 'Lower supervisory and technical occupations': [0.0, 166.0, 0.0, 321.0, 0.0],
 'MSOA11CD': ['E02000001',
  'E02000001 ',
  'E02000002',
  'E02000002 ',
  'E02000003'],
 'Never worked and long-term unemployed': [0.0, 225.0, 0.0, 503.0, 0.0],
 'Not classified': [0.0, 471.0, 0.0, 410.0, 0.0],
 'Routine occupations': [0.0, 168.0, 0.0, 659.0, 0.0],
 'Semi-routine occupations': [0.0, 290.0, 0.0, 964.0, 0.0],
 'Small employers and own account workers': [0.0, 416.0, 0.0, 478.0, 0.0],
 'number of crimes': [2125.0, 0.0, 517.0, 0.0, 1095.0]}

MSOA11CD - это столбец A сверху, а number of crimes - это столбец B. Этот фрейм данных был создан путем слияния

{'Higher managerial administrative and professional occupations': [2332.0,
  240.0,
  554.0,
  288.0,
  275.0],
 'Intermediate occupations': [538.0, 670.0, 1294.0, 847.0, 894.0],
 'Lower managerial administrative and professional occupations': [2098.0,
  733.0,
  1408.0,
  875.0,
  927.0],
 'Lower supervisory and technical occupations': [166.0,
  321.0,
  516.0,
  383.0,
  516.0],
 'MSOA11CD': ['E02000001 ',
  'E02000002 ',
  'E02000003 ',
  'E02000004 ',
  'E02000005 '],
 'Never worked and long-term unemployed': [225.0, 503.0, 656.0, 407.0, 560.0],
 'Not classified': [471.0, 410.0, 635.0, 386.0, 542.0],
 'Routine occupations': [168.0, 659.0, 752.0, 603.0, 883.0],
 'Semi-routine occupations': [290.0, 964.0, 1156.0, 714.0, 1145.0],
 'Small employers and own account workers': [416.0,
  478.0,
  741.0,
  442.0,
  583.0]}

и

{'MSOA11CD': ['E02000001', 'E02000002', 'E02000003', 'E02000004', 'E02000005'], 'number of crimes': [2125, 517, 1095, 555, 914]}

, который был создан с помощью groupby на

{'Falls within': ['British Transport Police',
  'City of London Police',
  'Metropolitan Police Service',
  'Metropolitan Police Service',
  'Metropolitan Police Service'],
 'MSOA11CD': ['E02000001', 'E02000001', 'E02000001', 'E02000002', 'E02000003'],
 'number of crimes': [98, 1365, 662, 517, 1095]}

В идеале я хотел сохранить столбец Falls within, однако группировка по нему привела к потере всех числовых данных. Надеюсь, это поможет. Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Проблема объединения фреймов данных возникает из пробелов в конце строк в

 'MSOA11CD': ['E02000001 ',
  'E02000002 ',
  'E02000003 ',
  'E02000004 ',
  'E02000005 '],

Обратите внимание, что другие фреймы данных не содержат этих пробелов.Поэтому Pandas (правильно) рассматривает строки 'E02000001 ' и 'E02000001' как различные значения.Чтобы объединить их, удалите пробелы из этих строк:

df1['MSOA11CD'] = df1['MSOA11CD'].str.strip()

Например,

import sys
import pandas as pd
pd.options.display.width = sys.maxsize
pd.options.display.max_columns = None


df1 = pd.DataFrame({'Higher managerial administrative and professional occupations': [2332.0,
      240.0,
      554.0,
      288.0,
      275.0],
     'Intermediate occupations': [538.0, 670.0, 1294.0, 847.0, 894.0],
     'Lower managerial administrative and professional occupations': [2098.0,
      733.0,
      1408.0,
      875.0,
      927.0],
     'Lower supervisory and technical occupations': [166.0,
      321.0,
      516.0,
      383.0,
      516.0],
     'MSOA11CD': ['E02000001 ',
      'E02000002 ',
      'E02000003 ',
      'E02000004 ',
      'E02000005 '],
     'Never worked and long-term unemployed': [225.0, 503.0, 656.0, 407.0, 560.0],
     'Not classified': [471.0, 410.0, 635.0, 386.0, 542.0],
     'Routine occupations': [168.0, 659.0, 752.0, 603.0, 883.0],
     'Semi-routine occupations': [290.0, 964.0, 1156.0, 714.0, 1145.0],
     'Small employers and own account workers': [416.0,
      478.0,
      741.0,
      442.0,
      583.0]})

df2 = pd.DataFrame({'MSOA11CD': ['E02000001', 'E02000002', 'E02000003', 'E02000004', 'E02000005'], 'number of crimes': [2125, 517, 1095, 555, 914]})

df3 = pd.DataFrame({'Falls within': ['British Transport Police',
      'City of London Police',
      'Metropolitan Police Service',
      'Metropolitan Police Service',
      'Metropolitan Police Service'],
     'MSOA11CD': ['E02000001', 'E02000001', 'E02000001', 'E02000002', 'E02000003'],
     'number of crimes': [98, 1365, 662, 517, 1095]})

df1['MSOA11CD'] = df1['MSOA11CD'].str.strip()
df = pd.merge(df1, df2, on=['MSOA11CD'])
df = pd.merge(df, df3, on=['MSOA11CD'])

print(df)

дает

   Higher managerial administrative and professional occupations  Intermediate occupations  Lower managerial administrative and professional occupations  Lower supervisory and technical occupations   MSOA11CD  Never worked and long-term unemployed  Not classified  Routine occupations  Semi-routine occupations  Small employers and own account workers  number of crimes_x                 Falls within  number of crimes_y
0                                             2332.0                                 538.0                                             2098.0                                                   166.0  E02000001                                  225.0           471.0                168.0                     290.0                                    416.0                2125     British Transport Police                  98
1                                             2332.0                                 538.0                                             2098.0                                                   166.0  E02000001                                  225.0           471.0                168.0                     290.0                                    416.0                2125        City of London Police                1365
2                                             2332.0                                 538.0                                             2098.0                                                   166.0  E02000001                                  225.0           471.0                168.0                     290.0                                    416.0                2125  Metropolitan Police Service                 662
3                                              240.0                                 670.0                                              733.0                                                   321.0  E02000002                                  503.0           410.0                659.0                     964.0                                    478.0                 517  Metropolitan Police Service                 517
4                                              554.0                                1294.0                                             1408.0                                                   516.0  E02000003                                  656.0           635.0                752.0                    1156.0                                    741.0                1095  Metropolitan Police Service                1095
1 голос
/ 02 июня 2019

Возможно, в строковом значении ячейки есть пробел.Вы можете попытаться опустить пробелы, используя pandas.Series.str.strip .Ниже приведен кадр данных, который содержит пробел в столбце A в строке 0:

df=pd.read_csv('d:/sof/training/file5.csv', sep='\s+')
df.at[0,'A']='x '
df

Вывод:

, а затем япопробуйте df.groupby('A').agg(sum, axis=0) и выведите:

Причиной появления дублирующихся значений является пробел в одном значении 'x'.Существует разница между ('x') и ('x').Поэтому убедитесь, что во всех значениях столбца A нет пробела.Ниже приведен результат после пропуска всех пробелов:

df.A=df.A.str.strip()
df=df.groupby('A').agg(sum, axis=0)
df

Вывод:

===== EDITED ====

после того, как я вижу, что есть пробел, посмотрите на это:

{'E02000001': Int64Index([0], dtype='int64'),
 'E02000001 ': Int64Index([1], dtype='int64'),
 'E02000002': Int64Index([2], dtype='int64'),
 'E02000002 ': Int64Index([3], dtype='int64'),
 'E02000003': Int64Index([4], dtype='int64')}

после использования pandas.strip, группа будет работать правильно:

df.MSOA11CD=df.MSOA11CD.str.strip()
df.groupby('MSOA11CD').groups

Вывод:

{'E02000001': Int64Index([0, 1], dtype='int64'),
 'E02000002': Int64Index([2, 3], dtype='int64'),
 'E02000003': Int64Index([4], dtype='int64')}

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...