Pandas самодостаточность данных в кадре для заполнения столбца - PullRequest
0 голосов
/ 30 октября 2018

У меня есть датафрейм с данными как:

enter image description here

Значение "отношение" определяется из кодового идентификатора. Кожа имеет "кодид" = 11, который уже появился на сумке, поэтому в отношении мы положили значение сумки.
То же самое происходит с обувью.

ToDo: Заполните значение "отношение", установив проверку кодового идентификатора в терминах данных. Любая помощь будет оценена.

Редактировать: тот же код, например 11 может появиться> дважды. Но «отношение» может иметь значение только как bag, потому что bag - это первое, у которого codeid = 11. я тоже обновил картинку.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Я думаю, вы хотите сделать что-то вроде этого:

import pandas as pd
df = pd.DataFrame([['bag', 11, 'null'], 
                  ['shoes', 12, 'null'], 
                  ['shopper', 13, 'null'], 
                  ['leather', 11, 'bag'], 
                  ['plastic', 13, 'shoes']], columns = ['name', 'codeid', 'relation'])

def codeid_analysis(rows):
    if rows['codeid'] == 11:
        rows['relation'] = 'bag'
    elif rows['codeid'] == 12:
        rows['relation'] = 'shirt' #for example. You should put what you want here
    elif rows['codeid'] == 13:
        rows['relation'] = 'pants' #for example. You should put what you want here
    return rows

result = df.apply(codeid_analysis, axis = 1)
print(result)
0 голосов
/ 22 ноября 2018

Это не оптимальное решение, поскольку оно дорого обходится вашей памяти, но вот моя попытка. df1 создается для того, чтобы содержать значения null столбца relation, поскольку кажется, что нулевые значения - это первое вхождение. После некоторой очистки два кадра данных объединяются в один.

import pandas as pd
df = pd.DataFrame([['bag', 11, 'null'], 
                  ['shoes', 12, 'null'], 
                  ['shopper', 13, 'null'], 
                  ['leather', 11, 'bag'], 
                  ['plastic', 13, 'shopper'],
                  ['something',13,""]], columns = ['name', 'codeid', 'relation'])

df1=df.loc[df['relation'] == 'null'].copy()#create a df with only null values in relation
df1.drop_duplicates(subset=['name'], inplace=True)#drops the duplicates and retains the first entry
df1=df1.drop("relation",axis=1)#drop the unneeded column

final_df=pd.merge(df, df1, left_on='codeid', right_on='codeid')#merge the two dfs on the columns names
0 голосов
/ 30 октября 2018

Если хотите, чтобы только первое значение дублирования было последним дублированным, используйте transform с first, а затем установите NaN значения с помощью loc с duplicated :

df = pd.DataFrame({'id':[1,2,3,4,5],
                   'name':list('brslp'),
                   'codeid':[11,12,13,11,13]})

df['relation'] = df.groupby('codeid')['name'].transform('first')
print (df)
   id name  codeid relation
0   1    b      11        b
1   2    r      12        r
2   3    s      13        s
3   4    l      11        b
4   5    p      13        s

#get first duplicated values of codeid
print (df['codeid'].duplicated(keep='last'))
0     True
1    False
2     True
3    False
4    False
Name: codeid, dtype: bool

#get all duplicated values of codeid with inverting boolenam mask by ~ for unique rows   
print (~df['codeid'].duplicated(keep=False))
0    False
1     True
2    False
3    False
4    False
Name: codeid, dtype: bool

#chain boolen mask together 
print (df['codeid'].duplicated(keep='last') | ~df['codeid'].duplicated(keep=False))
0     True
1     True
2     True
3    False
4    False
Name: codeid, dtype: bool

#replace True values by mask by NaN 
df.loc[df['codeid'].duplicated(keep='last') | 
       ~df['codeid'].duplicated(keep=False), 'relation'] = np.nan
print (df)
   id name  codeid relation
0   1    b      11      NaN
1   2    r      12      NaN
2   3    s      13      NaN
3   4    l      11        b
4   5    p      13        s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...