Добавить значения суффикса подраздела к значениям столбца панд - PullRequest
0 голосов
/ 01 сентября 2018

Допустим, у меня есть датафрейм с несколькими столбцами. В одном столбце указан идентификационный номер (ID) для некоторых парней, а в другом столбце - некоторые из них, скажем, степень совершенных правонарушений. Пример тому:

`df
Out[63]: 
    Crime  ID
0      13   1
1      13   1
2      12   1
3      12   1
4      13   3
5      13   3
6      13   3
7      63   3
8      63   3
9      63   3
10     63   3
11      3   3
12      7   6
13      7   6
14     13   6
15     13   6
16     45   6`

Можно ли классифицировать удостоверения личности по разнообразию преступлений? Возможный вывод будет:

`df1
Out[64]: 
    Crime  ID
0      13   1
1      13   1
2      12   1.1
3      12   1.1
4      13   3
5      13   3
6      13   3
7      63   3.1
8      63   3.1
9      63   3.1
10     63   3.1
11      3   3.2
12      7   6
13      7   6
14     13   6.1
15     13   6.1
16     45   6.2`

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Возможно, есть лучшее решение, но сейчас я думаю, что вложенное groupby может сделать это.

v = df.groupby('ID', sort=False).apply(
        lambda x: x.groupby('Crime', sort=False).ngroup()).reset_index(drop=True)
df['ID'] = np.where(
        v.eq(0), df['ID'], df['ID'].astype(str) + '.' + v.astype(str))

df
    Crime   ID
0      13    1
1      13    1
2      12  1.1
3      12  1.1
4      13    3
5      13    3
6      13    3
7      63  3.1
8      63  3.1
9      63  3.1
10     63  3.1
11      3  3.2
12      7    6
13      7    6
14     13  6.1
15     13  6.1
16     45  6.2
0 голосов
/ 01 сентября 2018

Использование groupby с factorize

s=df.groupby(['ID'],as_index=False)['Crime'].apply(lambda x : ('.'+pd.Series(pd.factorize(x)[0]).astype(str)).replace('.0','')).reset_index(drop=True)
s
Out[121]: 
0       
1       
2     .1
3     .1
4       
5       
6       
7     .1
8     .1
9     .1
10    .1
11    .2
12      
13      
14    .1
15    .1
16    .2
Name: Crime, dtype: object

df.ID.astype(str)+s
Out[122]: 
0       1
1       1
2     1.1
3     1.1
4       3
5       3
6       3
7     3.1
8     3.1
9     3.1
10    3.1
11    3.2
12      6
13      6
14    6.1
15    6.1
16    6.2
dtype: object
0 голосов
/ 01 сентября 2018

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

Во-первых, вам нужно пары DIX-карт (Crime, ID) для идентификаторов, чтобы, например, вы могли присвоить строке 9 тот же идентификатор, что и строке 7.

Далее, вам нужны идентификаторы для точного сопоставления с самыми высокими на данный момент подидентификаторами, чтобы, например, вы могли присвоить строке 16 идентификатор, отличный от строк 12 и 14.

Как-то так (не проверено):

def remap(df):
    pairmap = {}
    subidmap = {}
    for row in df.itertuples():
        if (row.Crime, row.ID) not in pairmap:
            if row.ID not in subidmap:
                subidmap[row.ID] = 0
                subid = str(row.ID)
            else:
                subidmap[row.ID] += 1
                subid = f'{row.ID}.{subidmap[row.ID]}'
            pairmap[row.Crime, row.ID] = subid
        yield pairmap[row.Crime, row.ID]    

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