如果行(不是单独的列)包含字符串

时间:2018-02-15 16:54:07

标签: python pandas csv lambda contains

我从CSV导入数据,我用“EMPTYFIELD”值替换空字段。

pd.read_csv('myFile.csv', usecols=['AAA', 'BBB', 'CCC'])
df =  df.fillna('EMPTYFIELD')

我正在尝试创建一个包含“EMPTYFIELD”值的所有行的数据框。这意味着至少有一列包含此值。我使用了以下内容,它的工作原理:

error = df[df.AAA.str.contains('EMPTYFIELD')]
error = error[error.BBB.str.contains('EMPTYFIELD')]
error = error[error.CCC.str.contains('EMPTYFIELD')] 

现在,我正在尝试减少代码中的行。所以,我在考虑使用lambda而不引用列(理想):

error2 = df.apply(lambda x: 'EMPTYFIELD' if 'EMPTYFIELD' in x else x)

#error2 = df.apply(lambda x : any([ isinstance(e, 'EMPTYFIELD') for e in x ]), axis=1) 

然后我也尝试引用列:

error2 = df[usecols].apply(lambda x: 'EMPTYFIELD' if 'EMPTYFIELD' in x else x)

error2 = df[df[usecols].isin(['EMPTYFIELD'])]

以上工作都没有。我将结果打印在新的CSV文件中。我可以看到所有行,即使它们包含'EMPTYFIELD'值。

UPD:这是我的扩展代码。由于以下几行,部分答案会返回错误:

varA      = 'AAA';
dfGrouped = df.groupby(varA, as_index=False).agg({'Start Date': 'min', 'End Date': 'max'}).copy()

varsToKeep = ['AAA', 'BBB', 'CCC', 'Start Date_grp', 'End Date_grp' ]
dfTemp = pd.merge(df, dfGrouped, how='inner', on='AAA', suffixes=(' ', '_grp'), copy=True)[varsToKeep]

errors = dfTemp [~np.logical_or.reduce([dfTemp [varsToKeep] .str.contains('EMPTYFIELD'),用于dfTemp中的varsToKeep))

3 个答案:

答案 0 :(得分:1)

一种方法是使用np.logical_or.reduce。这是一个例子:

import pandas as pd, numpy as np

df = pd.DataFrame([['A', 'B', 'C', 'D'],
                   ['E', 'F', 'G', 'H'],
                   ['G', 'A', 'D', 'I'],
                   ['L', 'K', 'A', 'J'],
                   ['S', 'T', 'U', 'V']],
                  columns=['COL1', 'COL2', 'COL3' ,'COL4'])

df[~np.logical_or.reduce([df[col].astype(str).str.contains('A') for col in df])]

#   COL1 COL2 COL3 COL4
# 1    E    F    G    H
# 4    S    T    U    V

答案 1 :(得分:1)

以下是dropna()作为mentioned in the comments使用df = pd.DataFrame( {'A': [5,3,5,6], 'B': [None, "foo", "bar", "foobar"], 'C': ["foo","bar",None, "bat"] } ) no_errors = df.dropna() errors = df[~(df.index.isin(no_errors.index))] 的说明:

print(no_errors)
#   A       B    C
#1  3     foo  bar
#3  6  foobar  bat

print(errors)
#   A     B     C
#0  5  None   foo
#2  5   bar  None

这导致以下2个数据帧:

fillna()

现在,如果您愿意,可以在错误DataFrame上调用Method m; // the method object ClassPool pool = ClassPool.getDefault(); CtClass cc = pool.get(m.getDeclaringClass().getCanonicalName()); CtMethod javassistMethod = cc.getDeclaredMethod(m.getName()); int linenumber = javassistMethod.getMethodInfo().getLineNumber(0);

答案 2 :(得分:0)

正如我提到的使用apply来自jp的数据

df[~df.apply(lambda x : x.str.contains('A')).any(1)]
Out[491]: 
  COL1 COL2 COL3 COL4
1    E    F    G    H
4    S    T    U    V