Разделение строк в Pandas на основе значений столбцов и сопоставления имен столбцов - PullRequest
0 голосов
/ 29 мая 2018

У меня есть датафрейм с двумя столбцами Имя лица и Название компании.Я хочу создать еще два столбца под названием Name и Name_Type.Имя будет представлять собой имя человека и компании, а столбец Name_Type будет определять, является ли имя человеком или компанией.В некоторых строках есть пустые строки, что создает четыре возможности:

1) Пустой человек + Пустая компания = Можно оставить пустым.

2) Пустой человек + Название компании = Название компании Значение

3) Имя человека + Пустое лицо = Значение имени пользователя

4) Оба имени = Разделить их на две строки.Не могу понять, как это сделать.

Я новичок в Python и Pandas, я не нашел ответа онлайн.Надеюсь найти что-то здесь.Пожалуйста, извините формат или другие ошибки.

Ввод:

df = pd.DataFrame({"Person_name": ["Aaron", "", "Phil", "Joe"], 
                  "Company_name": ["", "XYZ Inc", "ABC LLC", ""]})

    Company_name    Person_name
0                   Aaron
1   XYZ Inc 
2   ABC LLC         Phil
3                   Joe

Ожидаемый вывод:

    Company_name    Person_name Name    Name_Type
0                   Aaron       Aaron   Person_name
1   XYZ Inc                     XYZ Inc Company_name
2   ABC LLC         Phil        Phil    Person_name
2   ABC LLC         Phil        ABC LLC Company_name
3                   Joe         Joe     Person_name

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

(df1.melt('index', var_name='Name_Type', value_name='Name')
   .replace('',np.nan).dropna()
   .merge(df1, on='index').sort_values('index')
   .set_index('index'))

Выход:

          Name_Type     Name Person_name Company_name
index                                                
0       Person_name    Aaron       Aaron             
1      Company_name  XYZ Inc                  XYZ Inc
2       Person_name     Phil        Phil      ABC LLC
2      Company_name  ABC LLC        Phil      ABC LLC
3       Person_name      Joe         Joe                  
0 голосов
/ 29 мая 2018

Вы можете использовать apply, unstack и merge

df = pd.DataFrame({"Person_name": ["Aaron", "", "Phil", "Joe"], 
                  "Company_name": ["", "XYZ Inc", "ABC LLC", ""]})

def logic(row):
    if row.Company_name and row.Person_name:
        return pd.Series([[row.Person_name, "Person_name"], [row.Company_name, "Company_name"]])
    else:
        return pd.Series([[row.Person_name, "Person_name"] if row.Person_name else [row.Company_name, "Company_name"]])
df2 = df.apply(logic, 1).unstack().apply(pd.Series).dropna().reset_index().set_index("level_1").sort_index()
dff = pd.merge(df,df2, left_index=True, right_index=True).iloc[:, [0,1,3,4]]
dff.columns = ["Company_name", "Person_name", "Name", "Name_Type"]

Выход

    Company_name    Person_name Name    Name_Type
0                   Aaron       Aaron   Person_name
1   XYZ Inc                     XYZ Inc Company_name
2   ABC LLC         Phil        Phil    Person_name
2   ABC LLC         Phil        ABC LLC Company_name
3                   Joe         Joe     Person_name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...