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
编辑:
如果 strings
和 none
值为空:
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)
这可能不是最有效的方法,但我认为它的可读性很好。
给定以下数据框:
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]
感谢 endswith
的评论:
for cols in df.columns:
df.loc[~df[cols].str.endswith(']'), cols] = df[cols] + ']'
print df
编辑:
如果 strings
和 none
值为空:
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)
这可能不是最有效的方法,但我认为它的可读性很好。