我已经阅读了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或其他东西。
任何帮助都会非常感激。 谢谢!
答案 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