无法为空值评估列

时间:2017-08-04 21:13:12

标签: python pandas if-statement null

我已经阅读了20多个帖子,我仍然空着(没有双关语)。

我有一个pandas数据帧df_s,它有一个包含iloc [:,8]日期的列。我试图根据另一列中是否有值,使用值(是/否)向数据框添加新列。

这就是我一直在尝试的:

CDRFormUp = []
for row in df_s.iloc[:,8]:
    if row=="":
            CDRFormUp.append('No')
    else:
            CDRFormUp.append('Yes')
df_s['CDR Form Up'] = CDRFormUp

CDRFormUp将是新专栏。我正在运行数据框中的每一行,并检查列中的值是否为任何值。

我试过......

if row <>"":
if row == "":
if row is None:
if row:
if row>0:

什么都没有用。该列包含日期和空单元格和文本。例如,第一行中此列中的值为“CDF Form”,第二行中的值为空白,第三行中为“4865”或类似值。

如果我将iloc设置为仅包含国家/地区名称的其他列,并将条件设置为“Country =”Italy“,则会为每行的新列正确添加”是“或”否“。那么这不是一个错误的iloc或其他东西。

任何帮助都会非常感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

您需要将np.where与Pandas数据帧一起使用。

df_s = pd.DataFrame(np.random.randint(1,10,(5,10)))

df_s.iloc[1,8] = ''

df_s.iloc[3,8] = np.nan

df_s['CDRFormUp'] = np.where(df_s.iloc[:,8].mask(df_s.iloc[:,8].str.len()==0).isnull(),'Yes','No')

print(df_s)

输出:

   0  1  2  3  4  5  6  7    8  9 CDRFormUp
0  6  5  5  5  9  3  3  5    3  9        No
1  5  4  7  3  9  6  8  9       9       Yes
2  5  2  2  7  7  6  3  2    5  2        No
3  8  2  1  9  7  3  7  8  NaN  8       Yes
4  4  4  1  5  3  5  9  4    4  9        No

答案 1 :(得分:0)

我怀疑你的元素有空格。

考虑datafame df_s

df_s = pd.DataFrame([
    [1, 'a', 'Yes'],
    [2, '', 'No'],
    [3, ' ', 'No']
])

df_s

   0  1    2
0  1  a  Yes
1  2      No
2  3      No

第1列中的第1行和第2行都看起来像空字符串。但他们不是

df_s.iloc[:, 1] == ''

0    False
1     True
2    False
Name: 1, dtype: bool

您可能需要考虑查看整个事物是否为空白区域或首先剥离空白区域。

选项1
全白空间

df_s.iloc[:, 1].str.match('^\s*$')

0    False
1     True
2     True
Name: 1, dtype: bool

我们可以使用

转换为是/否
df_s.iloc[:, 1].str.match('^\s*$').map({True: 'no', False: 'yes'})

0    yes
1     no
2     no
Name: 1, dtype: object

添加新列

df_s.assign(
    CDRFormUp=df_s.iloc[:, 1].str.match('^\s*$').map({True: 'no', False: 'yes'})
)

   0  1    2 CDRFormUp
0  1  a  Yes       yes
1  2      No        no
2  3      No        no

选项2
剥离空格然后检查是否为空

df_s.iloc[:, 1].str.strip() == ''

0    False
1     True
2     True
Name: 1, dtype: bool

添加新列

df_s.assign(
    CDRFormUp=df_s.iloc[:, 1].str.strip().eq('').map({True: 'no', False: 'yes'})
)

   0  1    2 CDRFormUp
0  1  a  Yes       yes
1  2      No        no
2  3      No        no