在 column1 中查找确切的单元格值并将 column2 的值连接到新列中

Posted

技术标签:

【中文标题】在 column1 中查找确切的单元格值并将 column2 的值连接到新列中【英文标题】:Find exact cell-values in column1 and join values of column2 into new column 【发布时间】:2021-03-30 04:39:48 【问题描述】:
import pandas as pd
import numpy as np

df = pd.read_csv ('input.csv')
df.head()
df['visibility'] = np.where(df['sku']== df['parent-sku'], 'visible', 'search') #add column if same sku in parent-sku
  
combo4 = df.groupby(['parent-sku'])['sku'].apply(', '.join)
data = print(combo4)
df['grouped items'] = np.where(df['sku']== df['parent-sku'], data, '') #format(combo2)


df.to_csv('output.csv', index=False)

所以,我的目标是检查所有 CSV 文件, 在“PARENT-SKU”列中检查行中的重复值,(例如,4 项相同); 从旁边的 SKU 列中获取值(每个都是唯一的); 用逗号合并并附加到新的 GROUPED 列 - 仅适用于第一次重复 PARENT-SKU 或仅具有“可见”的那个

我无法理解它。它出什么问题了? 分组项的当前输出为 NaN。

数据示例:

Parent SKU SKU VISIBLE
A A1 VISIBLE
A A2 SEARCH
A A3 SEARCH
B B1 VISIBLE
B B2 SEARCH

我得到了非常糟糕的结果,当尝试使用函数时,我很想看到输出:

Parent SKU SKU VISIBLE GROUPED ITEMS
A A1 VISIBLE A1,A2,A3
A A2 SEARCH
A A3 SEARCH
B B1 VISIBLE B1,B2
B B2 SEARCH

非常感谢!给你一杯啤酒!

【问题讨论】:

根据您的评论,尝试我更新的答案。我在我的手机上,所以还没有测试。 【参考方案1】:

您可以将.groupbyjoin 组中的项目转换为字符串。从那里使用mask 来识别duplicated() 行,您可以将其更改为''

根据您的评论,您还可以使用 replace 排除某些单词,但您必须使用一些正则表达式来替换逗号,具体取决于前面还是后面,但您不希望替换字体和反逗号。否则,某些项目不会用逗号分隔。此正则表达式 (,)? 向后查找可选逗号:

srs = df.groupby('Parent SKU')['SKU'].transform(','.join)
df['GROUPED ITEMS'] = (srs.replace(['simple(,)?', '(,)?simple'], '', regex=True)
                          .mask(srs.duplicated(), ''))
df

或者如果你想要列表格式,那么你可以使用str.split(','):

srs = df.groupby('Parent SKU')['SKU'].transform(','.join)
df['GROUPED ITEMS'] = (srs.replace(['simple(,)?', '(,)?simple'], '', regex=True)
                          .mask(srs.duplicated(), ''))
df

Out[1]: 
  Parent SKU     SKU  VISIBLE GROUPED ITEMS
0          A      A1  VISIBLE         A1,A3
1          A  simple   SEARCH              
2          A      A3   SEARCH              
3          B      B1  VISIBLE         B1,B2
4          B      B2   SEARCH              

【讨论】:

哇,这真是太棒了。如果Column3(产品类型)中有“简单”,也许你知道如何跳过GROUPED ITEMS - 否则,如果产品类型很简单,它会为它添加分组项目SKU......不太了解python跨度> 哇,python 好强大!感谢您的帮助【参考方案2】:

这是一种方法。

my_dict = 
my_list = []

for val in df['Parent SKU'].values:
    my_dict[val] = []

for val in df['SKU'].values:
    if val[0] in my_dict:
       my_dict[val[0]].append(val)
    
for val in df['SKU'].values:
    if val[1] == '1':
        my_list.append(my_dict[val[0]])
    else:
        my_list.append('')

df['GROUPED ITEMS'] = my_list

输出:

     parentSKU  SKU   visible        GROUPED ITEMS
0         A     A1      visible        [A1, A2, A3]
1         A     A2      search  
2         A     A3      search  
3         B     B1      visible        [B1, B2]
4         B     B2      search  

【讨论】:

以上是关于在 column1 中查找确切的单元格值并将 column2 的值连接到新列中的主要内容,如果未能解决你的问题,请参考以下文章

如何根据单元格值在datagridview行中应用循环

在工作簿 1(A 列)和工作簿 2(A 列)中查找匹配的单元格值;粘贴对应数据

用于查找单元格值是不是在范围内的双 For 循环

格式化后查找/替换未找到单元格值

如何根据列和行中提供的条件查找表格单元格值?

如何从另一个工作表中获取单元格值并将其分配给 UDF 的返回值?