【发布时间】:2018-07-26 12:24:17
【问题描述】:
我从 CSV 导入数据,在该 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') for varsToKeep in dfTemp])]
【问题讨论】:
-
“现在,我正在尝试减少行”这是什么意思?
-
如果你想删除包含错误字段的行,为什么不直接使用
df[~df.AAA.str.contains('EMPTYFIELD')]? -
@pault 我不想引用列名。 AAA 是其中一列。
-
您可以使用
dropna()创建第二个DataFrame。然后使用第二个的索引过滤第一个。
标签: python pandas csv lambda contains