【问题标题】:pandas dataframe: set column row val equal to value of another column if several conditions have been met, otherwise defaultpandas dataframe:如果满足多个条件,则将列行val设置为另一列的值,否则默认
【发布时间】: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'] 的注释。

【问题讨论】:

  • 您的代码不包括第一个ifFalse 的情况(没有else)。这种情况下的价值是什么?空白还是'O'?
  • 也是“O”。我尝试从 df['e']='O' 开始,然后修改,但 'O' 转回 nans - 它似乎更新了整个列,而不仅仅是首选列不是 'O' 的地方。我想我可以只填充na('O'),但该代码也遇到了问题。

标签: python pandas dataframe


【解决方案1】:

这个方法怎么样:

  • 此代码使用difflib 模块查找同一行的ab 列中的字符串之间的相似度度量
  • 检查相似度是否等于或高于 80%,并为列 e 分配适当的值

代码:

import pandas as pd
import difflib

my_dict = {'a':['O', 'B-POS', 'I-POS', 'O', 'L-POS'], 'b':['O','I-POS','B-POS','I-POS','I-POS']
               , 'c':['O','O','OPN','O',''], 'd':['O','O','OPN','O','O']}

df = pd.DataFrame.from_dict(my_dict)
print(df)
df['e'] = df.apply(lambda x: x['a'] if difflib.SequenceMatcher(None, x['a'], x['b']).ratio()>=.8
                                       and x['a'] != 'O'
                                       and x['c']==x['d']  else 'O', axis=1)

print(df)

输入

       a      b    c    d
0      O      O    O    O
1  B-POS  I-POS    O    O
2  I-POS  B-POS  OPN  OPN
3      O  I-POS    O    O
4  L-POS  I-POS         O

输出

       a      b    c    d      e
0      O      O    O    O      O
1  B-POS  I-POS    O    O  B-POS
2  I-POS  B-POS  OPN  OPN  I-POS
3      O  I-POS    O    O      O
4  L-POS  I-POS         O      O

【讨论】:

  • 完美。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2022-10-07
  • 2018-11-29
  • 2020-03-11
相关资源
最近更新 更多