首页 > 解决方案 > 需要根据另一列的条件添加一行

问题描述

我需要在我的 df 中添加一行,其中包含基于另一列标准的某些文本。根据列标准,然后将在该特定行下添加一行。

ID     Name      Order    Children   Pet  
12     Joe       Parent     yes      dog
13     Mary      Parent     yes      cat
14     Paul      Parent     yes      dog
15     Emma      Parent     yes      cat

在我的示例数据框中,如果父母有孩子并且父母有宠物(仅适用于这种情况的狗),我想转换数据并插入行。我想要以下最终结果。

ID     Name         Order    Children   Pet  
12     Parent; Joe  Parent     yes      dog
12     Child; Joe
12     Dog; Joe
13     Parent; Mary Parent     yes      cat
13     Child; Mary
14     Parent; Paul Parent     yes      dog
14     Child; Paul
14     Dog; Paul
15     Parent; Emma Parent     yes      cat
15     Child; Emma

添加前缀

df['Name'] = 'Parent; ' + df['Name'].astype(str)

之后,我尝试复制 df 然后堆叠 df - 它有效,但这是一种令人筋疲力尽的方法。所以我想要一个 if 语句。如果 Child == 'yes',则在相应的父级下方添加行,该行显示为 'Child;' + 父母姓名。然后另一个 if for if Pet == 'dog',在子项下方添加一行,内容为 'Dog; ' + 父级名称。

稍后我将使用 df.drop 删除 order、children 和 pet 列。

标签: pythonpandasreplaceduplicatesfillna

解决方案


这样的事情是否适合您,或者您需要您的数据模型有所不同?

In [1]:
import pandas as pd
##Create Dataframe
cols = ['Name', 'Order', 'Children', 'Pet']  
data = [['Joe', 'Parent', 'yes', 'dog'],
        ['Mary', 'Parent', 'yes', 'cat'],
        ['Paul', 'Parent', 'yes', 'dog'],
        ['Emma', 'Parent', 'yes', 'cat']
       ]
df = pd.DataFrame(data=data, columns=cols)

## Split in as many group as we want
Parent = 'Parent; ' + df['Name']
Child = 'Child ; ' + df.loc[df['Children']=='yes', 'Name']
Dog = 'Dog ; ' + df.loc[df['Pet']=='dog', 'Name']
## Concatenate them
df_final = pd.concat([Parent, Child, Dog])
df_final.to_frame().sort_index()

Out [1]:
    Name
0   Parent; Joe
0   Child ; Joe
0   Dog ; Joe
1   Parent; Mary
1   Child ; Mary
2   Parent; Paul
2   Child ; Paul
2   Dog ; Paul
3   Parent; Emma
3   Child ; Emma

推荐阅读