Две колонки уникальных строк - PullRequest
2 голосов
/ 07 мая 2019

Я хочу найти уникальную комбинацию столбцов person1 и person2, несмотря на обратные значения в моем фрейме данных. Ниже вы можете найти исходный пример Dataframe, где я хочу найти уникальных людей:

df = pd.DataFrame({"person1":["AL","IN","AN","DL","IN","AL","AL","IN","AN"],
                   "person2":["AL","AN", np.nan,"AL","AN","AL","DL","IN","IN"]})

  person1  person2
0     AL      AL
1     IN      AN
2     AN      NAN
3     DL      AL
4     IN      AN
5     AL      AL
6     AL      DL
7     IN      IN
8     AN      IN

Мой желаемый вывод выглядит так:

  person1  person2  person
0     AL      AL     AL
1     IN      AN    IN/AN
2     AN      NAN    AN
3     DL      AL    DL/AL
4     IN      AN    IN/AN
5     AL      AL     AL
6     AL      DL    DL/AL  # Since it has been added as DL/AL NOT AL/DL
7     IN      IN     IN
8     AN      IN    IN/AN  # Since it has been added as IN/AN NOT AN/IN

Я использовал этот код:

df['person'] = np.where(df.person1 != df.person2,
                                     df.person1 + "/" + df.person2, df.person1)

Но он возвращает с AL/DL и AN/IN в индексах 6 и 8 в моем примере выше. Как всегда, когда я не вижу правильного подхода, где я могу получить уникальный порядок DL/AL и IN/AN

Панды гуру, пожалуйста, покажи мне путь :)

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

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

df['person']=df.apply(lambda r: r.drop_duplicates().sort_values().str.cat(sep='/'), axis=1)

print(df)

Вывод:

  person1 person2 person
0      AL      AL     AL
1      IN      AN  AN/IN
2      AN     NaN     AN
3      DL      AL  AL/DL
4      IN      AN  AN/IN
5      AL      AL     AL
6      AL      DL  AL/DL
7      IN      IN     IN
8      AN      IN  AN/IN
0 голосов
/ 07 мая 2019

По возможности сортировка обоих столбцов:

df1 = pd.DataFrame(np.sort(df[['person1','person2']].fillna('')), 
                   index=df.index,
                   columns=['person1','person2'])
df['person'] = np.where(df1.person1 != df1.person2,
                        df1.person1.str.cat(df1.person2,  sep="/").str.strip('/'),
                        df1.person1)
print (df)
  person1 person2 person
0      AL      AL     AL
1      IN      AN  AN/IN
2      AN     NaN     AN
3      DL      AL  AL/DL
4      IN      AN  AN/IN
5      AL      AL     AL
6      AL      DL  AL/DL
7      IN      IN     IN
8      AN      IN  AN/IN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...