Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 条件连接_Python 3.x_Pandas_String Concatenation - Fatal编程技术网

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)