【问题标题】:Pandas - Repeat row if found in list and countPandas - 如果在列表中找到重复行并计数
【发布时间】:2022-08-09 14:12:48
【问题描述】:

如果在列表中找到重复行需要帮助。

  • 如果在列表增量计数中找到值
  • 如果找到多个实例,则通过递增计数重复该行

数据框:

data = {\'First_Name\':[\'Tom\', \'Nick\', \'Daniel\', \'Jack\'],
        \'oter_col\':[\'other_value1\', \'other_value2\', \'other_value3\', \'other_value4\']}
df = pd.DataFrame(data)
df[\"repeation\"] = 0

Df 看起来像:

  First_Name      oter_col  count
0        Tom  other_value1      0
1       Nick  other_value2      0
2     Daniel  other_value3      0
3       Jack  other_value4      0

输入列表:

Full_Name = [\"Tom Cruise\", \"Tom Holland\", \"Tom Hardy\", \"Jack black\", \"Chris Hemsworth\"]

需要输出如:

  First_Name    Full_Name      oter_col  count
0        Tom   Tom Cruise  other_value1      1
1        Tom  Tom Holland  other_value1      2
2        Tom    Tom Hardy  other_value1      3
3       Jack   Jack black  other_value4      1
4       Nick               other_value2      1
5     Daniel               other_value3      0

尝试过这样的事情来获得第一个匹配索引,所以我可以重复该行但不知道该怎么做。

for name in Full_Name:
    m = df.First_Name.str.contains(name.split()[0])
    first_index_found = m.idxmax() if m.any() else None
    if type(first_index_found) == int:
        print(first_index_found)

    标签: python pandas dataframe


    【解决方案1】:

    您可以使用:

    # Create a regex pattern to extract First_Name from Full_Name
    pat = fr"\b({'|'.join(df['First_Name'])})\b"
    
    # Create a dataframe from Full_Name
    df1 = pd.DataFrame({'Full_Name': Full_Name})
    df1['First_Name'] = df1['Full_Name'].str.extract(pat)
    
    # Merge them on First_Name column
    out = df.merge(df1, on='First_Name', how='left')
    
    # Count (choose one)
    out['repeation'] = out.groupby('First_Name').cumcount().add(1)
    # OR
    out['repeation2'] = (out.dropna().groupby('First_Name').cumcount().add(1)
                            .reindex(out.index, fill_value=0))
    

    输出:

    >>> out
      First_Name      oter_col  repeation    Full_Name  repeation2
    0        Tom  other_value1          1   Tom Cruise           1
    1        Tom  other_value1          2  Tom Holland           2
    2        Tom  other_value1          3    Tom Hardy           3
    3       Nick  other_value2          1          NaN           0
    4     Daniel  other_value3          1          NaN           0
    5       Jack  other_value4          1   Jack black           1
    

    【讨论】:

      【解决方案2】:

      您可以将 DataFrame 制作为 merge 并将非 NA 名称计算为每组 cumsum

      df2 = (pd.DataFrame({'Full_Name': Full_Name})
               .assign(First_Name=lambda d: d['Full_Name'].str.extract('(\w+)'))
            )
      (df
       .merge(df2, on='First_Name', how='left')
       .assign(repeation=lambda d: d['Full_Name'].notna().groupby(d['First_Name']).cumsum())
      )
      

      输出:

        First_Name      oter_col  repeation    Full_Name
      0        Tom  other_value1          1   Tom Cruise
      1        Tom  other_value1          2  Tom Holland
      2        Tom  other_value1          3    Tom Hardy
      3       Nick  other_value2          0          NaN
      4     Daniel  other_value3          0          NaN
      5       Jack  other_value4          1   Jack black
      

      【讨论】:

      • 我犹豫在 groupby 之前删除 NaN 但我认为你是对的。预期的输出不一致。
      猜你喜欢
      • 2020-02-27
      • 2018-03-19
      • 2017-08-18
      • 2022-11-13
      • 2020-06-10
      • 2023-03-14
      • 2021-09-03
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多