根据列值和映射列名称拆分Pandas中的行

时间:2018-05-29 15:49:04

标签: python pandas

我有一个包含两列人员姓名和公司名称的数据框。我想再创建两个名为Name和Name_Type的列。名称将是Person和Company Name的concat,Name_Type列将确定名称是Person类型还是Company类型。有些行有空字符串,这会产生四种可能性:

1)空人+空公司=可以留空。

2)空人+公司名称=公司名称值

3)人名+空人=人名值

4)两个Name =将它们分成两行。无法弄清楚如何做到这一点。

我是Python和熊猫的初学者,我没有在网上找到答案。希望能在这里找到一些东西。请原谅格式或其他错误。

输入:

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 :(得分:0)

您可以使用applyunstackmerge

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

答案 1 :(得分:0)

使用:

(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