我的数据集如下:
Paste_Values AB_IDs AC_IDs AD_IDs
AE-1001-4 AB-1001-0 AC-1001-3 AD-1001-2
AE-1964-7 AB-1964-2 AC-1964-7 AD-1964-1
AE-2211-1 AB-2211-1 AC-2211-3 AD-2211-2
AE-2182-4 AB-2182-6 AC-2182-7 AD-2182-5
我需要将Paste_values
列中的所有值与一行中的所有其他三个值进行比较。
例如:
AE-1001-4分为两部分AE
和1001-4
,我们需要检查1001-4
是否存在其他列
如果它不存在,我们需要创建新的列并放置相同的AE-1001-4
如果1001-4
与其他列匹配,我们需要将其更改为新列中的'AE-1001-5'inot
之后:
如果没有匹配项,我需要像在新创建的名为Paste_values
的列中那样写new_paste_value
的值。
如果同一行中的其他列中有匹配项(相同的值),那么我需要更改Paste_values
列中值的最后一位,以使整个值不应与该行中所有其他完整值,并且该新生成的值应写入new_paste_value
列中。
我需要对数据框中的每一行进行此操作。
所以结果应该像这样:
Paste_Values AB_IDs AC_IDs AD_IDs new_paste_value
AE-1001-4 AB-1001-0 AC-1001-3 AD-1001-2 AE-1001-4
AE-1964-7 AB-1964-2 AC-1964-7 AD-1964-1 AE-1964-3
AE-2211-1 AB-2211-1 AC-2211-3 AD-2211-2 AE-2211-4
AE-2182-4 AB-2182-6 AC-2182-4 AD-2182-5 AE-2182-1
我该怎么办?
答案 0 :(得分:2)
从定义要应用于DataFrame每行的函数开始:
def fn(row):
rr = row.copy()
v1 = rr.pop('Paste_Values') # First value
if not rr.str.contains(f'{v1[3:]}$').any():
return v1 # No match
v1a = v1[3:-1] # Central part of v1
for ch in '1234567890':
if not rr.str.contains(v1a + ch + '$').any():
return v1[:-1] + ch
return '????' # No candidate found
一些解释:
row 参数实际上是一个 Series ,其索引值取自 列名称。
因此 rr.pop('Paste_Values')会删除 first 值,该值保存在 v1 中 并且休息保留在 rr 中。
然后 v1 [3:] 提取 v1 的“其余”(不带“ AE-”) 和 str.contains 检查 rr 的每个元素是否 在结束位置包含此字符串。
有了这个解释,这个功能的其余部分应该相当 可以理解的。如果不是,则执行每个单独的指令,然后 打印结果。
唯一要做的就是将此函数应用于您的DataFrame, 将结果替换为新列:
df['new_paste_value'] = df.apply(fn, axis=1)
要运行测试,我创建了以下数据框:
df = pd.DataFrame(data=[
['AE-1001-4', 'AB-1001-0', 'AC-1001-3', 'AD-1001-2'],
['AE-1964-7', 'AB-1964-2', 'AC-1964-7', 'AD-1964-1'],
['AE-2211-1', 'AB-2211-1', 'AC-2211-3', 'AD-2211-2'],
['AE-2182-4', 'AB-2182-6', 'AC-2182-4', 'AD-2182-5']],
columns=['Paste_Values', 'AB_IDs', 'AC_IDs', 'AD_IDs'])
我没有收到有关此数据的错误。对以上数据进行测试。 也许您的错误原因出在其他地方?
也许您的DataFrame还包含 other ( float )列, 您没有将其包括在问题中。 如果是这种情况,请在您的DataFrame副本上运行我的函数, 删除了该“其他”列。