【问题标题】:Removing specific rows in Panda with Python使用 Python 删除 Pandas 中的特定行
【发布时间】:2020-11-22 10:53:30
【问题描述】:

我在 csv 文件中有以下示例。我想检查以下规则:

1- 首先检查所有名称中带有“-”破折号的父母:

2- 如果我们在所有 CSV 文件中搜索 (rule1) 的 df["Parent"] 类似于 df["Child"] : 对于此示例 Saher-1 在 row1 中是 Parent 并且在 row2 中也是 Child 并且对于该特定情况,如果 df[" Child"] 就像 df["Parent"],我想删除 Child 行。这里 Mori 是第 1 行中的 Child 和第 2 行中的 Parent

我不知道如何在这个示例中使用 if 子句。

我有以下文件:

Parent      Child
Saher-1      Mori
Mori        Saher-1
John        Jake
Saher-2     Mary

我的期望:

Parent        Child
Saher-1       Mori
John          Jake
Saher-2       Mary

【问题讨论】:

  • 这个列表是模棱两可的,因为我们如何仅仅通过查看列表就可以确定 Saher 是 Parent 而不是 Mori?仅仅因为它是先定义的?但是如果不按顺序怎么办?
  • 你是对的马科斯。第一个检查是关于名称。首先,我们应该查看 Parent 并查看 Parent 中是否存在任何“-”,然后检查所有 csv 文件是否我们找到的 Parent 存在于 child。必须删除子行。

标签: python python-3.x pandas python-2.7 dataframe


【解决方案1】:

让我们尝试左 merge 和可选参数 indicator=True 来识别满足指定规则的行:

m = df['Parent'].str.contains('-')
d = df.merge(df[m], left_on=['Parent', 'Child'], right_on=['Child', 'Parent'], how='left', indicator=True)
d = df[d['_merge'].eq('left_only')]

print(d)
    Parent Child
0  Saher-1  Mori
2     John  Jake
3  Saher-2  Mary

【讨论】:

  • @SaraDaniel 编码快乐!
【解决方案2】:
df = pd.DataFrame({
    'Parent':['Saher-1','Mori','John','Saher-2'],
    'Child':['Mori','Saher-1','Jake','Mary']
})
# print(df)
  Parent    Child
0  Saher-1     Mori
1     Mori  Saher-1
2     John     Jake
3  Saher-2     Mary

#check rows where parent-child have same names
df_dup = df[df['Child'].isin(df['Parent'].tolist())]
print(df_dup)
 Parent    Child
0  Saher-1     Mori
1     Mori  Saher-1

#remove them from main DF
df=pd.concat([df,df_dup]).drop_duplicates(keep=False)
print(df)
   Parent Child
2     John  Jake
3  Saher-2  Mary

#leave only parent with '-' in dubplaceted df
df_dup = df_dup[df_dup['Parent'].str.contains('-')]
print(df_dup)
Parent Child
0  Saher-1  Mori

#create final df
df=pd.concat([df,df_dup]).reset_index(drop=True)
print(df)
0     John  Jake
1  Saher-2  Mary
2  Saher-1  Mori

【讨论】:

    【解决方案3】:

    这个答案要求Parent总是用“-”或其他标记来标记,否则谁是Parent元素谁是Child变得模棱两可。其他人或许能给出更好的答案。

    import pandas as pd
    
    data = {"Parent": ["Saher-1", "Mori", "John"], "Child": ["Mori", "Saher-1", "Jake"]}
    
    df = pd.DataFrame(data=data)
    
    # This checks for Parents with dashes on the Child column
    df_temp = df[df["Child"].str.contains("-")] 
    
    # This use concat to join both dataframes, removing duplicates
    # Essentially, it removes the df_temp from df
    df = pd.concat([df, df_temp]).drop_duplicates(keep=False)
    
    print(df)
    >>>    Parent Child
    >>> 0  Saher-1  Mori
    >>> 2  John  Jake
    

    【讨论】:

    • 谢谢,但有一个问题:如果只有 Saher-1 是父级并且没有在其他行中作为子级重复。它将被忽略。我将您的代码结果保存在 csv 文件中,现在我看到所有包含第一条规则但不包含第二条规则的父级已被删除。所以我只是更新我的例子。
    猜你喜欢
    • 2018-05-09
    • 2012-09-14
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2023-03-07
    • 2021-02-27
    相关资源
    最近更新 更多