Python 3.x 条件连接
给定以下数据帧:Python 3.x 条件连接,python-3.x,pandas,string-concatenation,Python 3.x,Pandas,String Concatenation,给定以下数据帧: df = pd.DataFrame({'foo':['[a]','[b'], 'bar':['[a','[b]']}) df bar foo 0 [a] [a 1 [b [b] 我想在缺少值的单元格中添加一个右括号“]”。 预期的结果是: bar foo 0 [a] [a] 1 [b] [b] 但是,我不确定将有多少列,因此我希望将其应用于整个数据帧 我是从这个开始的,但运气不好: df2
df = pd.DataFrame({'foo':['[a]','[b'],
'bar':['[a','[b]']})
df
bar foo
0 [a] [a
1 [b [b]
我想在缺少值的单元格中添加一个右括号“]”。
预期的结果是:
bar foo
0 [a] [a]
1 [b] [b]
但是,我不确定将有多少列,因此我希望将其应用于整个数据帧
我是从这个开始的,但运气不好:
df2 = df(lambda x: str(x)+"]" if (len(x)<3))
您可以使用按列循环,因为
string
函数与Series
一起工作。配合使用
或通过~
与反转遮罩一起使用:
for cols in df.columns:
df.loc[~df[cols].str[-1].str.contains(']'), cols] = df[cols] + ']'
print df
bar foo
0 [a] [a]
1 [b] [b]
感谢您的使用意见:
编辑:
如果存在空的字符串
和无
值:
print df
0 [a
1 [b] [b
2 [a None
for col in df.columns:
df.loc[~df[col].str.endswith(']').replace({np.nan: False}), col] = df[col] + ']'
df[col] = df[col].replace({']': ''})
print df
bar foo
0 [a]
1 [b] [b]
2 [a] NaN
让我们了解一下
DataFrame.applymap()
函数
df.applymap(func_reference)
上面的行将调用df
中每个单元格上的func\u引用。现在我们可以设计我们的函数参考
def my_filter(cell):
if cell[-1] == ']':
return cell
return cell + ']'
filtered_df = df.applymap(my_filter)
这可能不是最有效的方法,但我认为它非常可读。我认为使用endswith
可能比contains
更简单。例如,~df[cols].str.endswith(']')
对不起,我应该把评论放在这里;如果有一个空白单元格怎么办?这似乎给了我一个索引错误:字符串索引超出范围。我尝试了这个方法,但没有成功:df2.loc[(~df2[cols].str[-1].str.endswith(']')和(~pd.isnull[cols]),cols]=df2[cols]+']'如果有空的字符串
,可以在输出中NaN
?对于endswith
,您不需要.str[-1]/code>组件,这就是endswith
的全部要点)。只要~df[cols].str.endswith(']')
就可以了。谢谢您的回复。我注意到,当某些单元格包含“None”或为空时,会出现以下错误:indexer错误:字符串索引超出范围。我本来应该在最初的问题中展示这个表格,但我认为这无关紧要。我会把它贴在上面。
print df
0 [a
1 [b] [b
2 [a None
for col in df.columns:
df.loc[~df[col].str.endswith(']').replace({np.nan: False}), col] = df[col] + ']'
df[col] = df[col].replace({']': ''})
print df
bar foo
0 [a]
1 [b] [b]
2 [a] NaN
df.applymap(func_reference)
def my_filter(cell):
if cell[-1] == ']':
return cell
return cell + ']'
filtered_df = df.applymap(my_filter)