Есть ли способ использовать функцию карты в пандах, чтобы объединить похожие строки в свой собственный столбец? - PullRequest
0 голосов
/ 15 октября 2019

Мне нужно использовать функцию карты панд, чтобы объединить две строки (описания) в одну новую строку. Новая строка - Кража со взломом, которая включает строки «Кража со взломом» и «Кража со взломом»).

df['Burglary'] = df['Burglary - Residence', 'Burglary - Non-Residence''].map()

Я ожидаю, что в каждой новой строке будет перечислено преступление и суммированы значения для каждой категории. что было объединено.

Текущие данные:

crime                        count         year
Burglary - Residence         21219         2013
Burglary - Non Residence     15946         2013
Bank Robbery                 92            2013
Holdup / Robbery             2907          2013

Новые данные:

crime          count      year
Burglary       37165      2013
Robbery        2999       2013

Ответы [ 4 ]

1 голос
/ 15 октября 2019

Вы можете создать словарь своего отображения и передать его в map.

crime_map = {
    'Burglary - Residence': 'Burglary',
    'Burglary - Non Residence': 'Burglary',
    'Bank Robbery': 'Robbery',
    'Holdup / Robbery': 'Robbery'
}

df['crime'] = df.crime.map(crime_map)    
df = df.groupby(['crime', 'year'], as_index=False).sum()

df

Out: 
      crime  year  count
0  Burglary  2013  37165
1   Robbery  2013   2999
0 голосов
/ 15 октября 2019

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

g=df['crime'].str.contains('Burglary')
typ = { True:'Burglary', False:'Robbery'}
df1 = df.groupby([g,'year'])['count'].sum().reset_index()
df1.crime=df1.crime.map(typ)
print(df1)

Выход

      crime     year    count
0   Robbery     2013    2999
1   Burglary    2013    37165
0 голосов
/ 15 октября 2019

Более обобщенный ответ @ Michael_Gardner

crime_map = {
    'Burglary - Residence': 'Burglary',
    'Burglary - Non Residence': 'Burglary',
    'Bank Robbery': 'Robbery',
    'Holdup / Robbery': 'Robbery'
}
df = df.assign(crime=df['crime'].map(crime_map)).groupby(['crime', 'year'], as_index=False).agg({'count': 'sum'})

Вывод

      crime  year  count
0  Burglary  2013  37165
1   Robbery  2013   2999
0 голосов
/ 15 октября 2019

Я думаю, вы можете использовать numpy.where :

result = df.assign(crime=np.where(df.crime.str.startswith('Burglary'), 'Burglary', df.crime))
print(result.groupby(['crime', 'year'], as_index=False).sum())

Выход

              crime  year  count
0      Bank Robbery  2013     92
1          Burglary  2013  37165
2  Holdup / Robbery  2013   2907

Обратите внимание на использование присвойте , чтобы вы могли сохранить исходный фрейм данных.

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