【发布时间】:2021-08-20 22:04:10
【问题描述】:
如果两个单元格值在同一行中重叠(即 B-POS、I-POS、U-POS、L-POS 中的任何一个 - 只需要 POS)- 设置单元格值以匹配其中一列(首选列)- 但是,重叠还必须在其他 2 个列中具有两个其他行值,并且具有完全匹配的标签。
我有这个简化(非工作)版本:
import pandas as pd
my_dict = {'a':['O', 'B-POS', 'I-POS', 'O', 'O'], 'b':['O','O','B-POS','I-POS','I-POS']
, 'c':['O','O','OPN','O',''], 'd':['O','O','OPN','O','O']}
df = pd.DataFrame.from_dict(my_dict)
list_to_make = []
if df['a'].isin(['B-POS', 'I-POS']).any() & df['b'].isin(['B-POS', 'I-POS']).any():
if df['c']==df['d']:
list_to_make.extend(df['a'])
else:
list_to_make.extend(['O']*len(df['a']))
df['e']=list_to_make
我打算对句子编号进行分组,然后在数据框中的每个句子上迭代地执行此操作,但这显然效率低下并且实际上不起作用,因为 df['c']==df['d'] 会引发错误.
是否有更好的方法来比较两列,如果两列中都有特定值,则在任何重叠在其他 2 列中具有共同值的条件下,将新列值设置为等于首选列的值?
我猜是伪代码:
如果
列中的任何位置都有特定的值
和
此值与另一列中的(相似)值一致,
和
此时(行索引)在另外两列中有完全匹配的值
然后
设置一个新列以匹配前两列之一(首选列)。
编辑: 忘了提一下:所需的输出应该与 df['a'] 匹配,因为所有条件都在 'row[2]' 上得到满足,并且首选 df['a'] 的注释。
【问题讨论】:
-
您的代码不包括第一个
if是False的情况(没有else)。这种情况下的价值是什么?空白还是'O'? -
也是“O”。我尝试从 df['e']='O' 开始,然后修改,但 'O' 转回 nans - 它似乎更新了整个列,而不仅仅是首选列不是 'O' 的地方。我想我可以只填充na('O'),但该代码也遇到了问题。