Pandas 有条件地连接

Pandas Conditionally Concatenate

给定以下数据框:

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))

提前致谢!

更新: 我实际上正在使用看起来像这样的 table:

    0       1        2 
0   b [r]   None    None
1   c [d    d [r]   f[d]
2   g [r]   h [d]   None
3   m [r    p [d]   None
4   b [r]   n [d
5   m [d]   a [r]   None

您可以使用按列循环,因为 string 函数适用于 Series。使用 indexing with str with loc

print df
   bar  foo
0   [a  [a]
1  [b]   [b

for cols in df.columns:
    #print df[cols].str[-1] != ']'  
    df.loc[df[cols].str[-1] != ']', cols] = df[cols] + ']'
print df   
   bar  foo
0  [a]  [a]
1  [b]  [b]  

或使用 contains~:

的反转掩码
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]        

感谢 use endswith 的评论:

for cols in df.columns:
    df.loc[~df[cols].str.endswith(']'), cols] = df[cols] + ']'
print df 

编辑:

如果 stringsnone 值为空:

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_reference。现在我们可以设计我们的 func_reference.

def my_filter(cell):
    if cell[-1] == ']':
        return cell
    return cell + ']'

filtered_df = df.applymap(my_filter)

这可能不是最有效的方法,但我认为它的可读性很好。