df=pd.DataFrame({'0':["qwa-abc","abd-xyz","abt-Rac","xyz-0vc"],'1':['axc-0aa',"abd-xyz","abt-Rac","xyz-1avc"],
'3':['abc-aaa',"NaN","abt-9ac","xyz-9vc"]})
我有这个DataFrame,我想检查每一行和每一列的特定值。例如索引0 有4个值“ qwa-abc”,“ abd-xyz”,“ abt-Rac”,“ xyz-0avc”。
对于每个要检查的值xxx- 任何数字 xx。
示例:
qua-abc在第4位有 a ,因此什么也不做。当到达xyz- 0 ac时,位置4处为数字0。因此,它应运行用户定义函数以将整个值(xyz-0vc)替换为用户定义函数获得的值。
注意:我尝试运行str.replace,但它仅支持特定的用户定义字符串。在此,用户功能将连接到其他系统并获取字符串。因此它不是预定义。
答案 0 :(得分:1)
您不需要单独的方法,请尝试以下操作:
In [1200]: df.loc[df['0'].str[4].str.isdigit(), '0'] = 'myvalue'
In [1201]: df
Out[1201]:
0 1 3
0 qwa-abc axc-0aa abc-aaa
1 abd-xyz abd-xyz NaN
2 abt-Rac abt-Rac abt-9ac
3 myvalue xyz-1avc xyz-9vc
In [1242]: def check_digit(cols,new_val):
...: for i in cols:
...: df.loc[(df[i].str[4].str.isdigit()) & (df[i].notna()), i] = new_val
...:
In [1243]: df.apply(lambda x: check_digit(df.columns, 'myval'), 1)
In [1244]: df
Out[1244]:
0 1 3
0 qwa-abc myval abc-aaa
1 abd-xyz abd-xyz NaN
2 abt-Rac abt-Rac myval
3 myval myval myval
答案 1 :(得分:1)
如果要更改数据框中的所有单元格,则需要在行轴上使用pd.apply
,因此自定义函数需要将pd.Series
作为参数之一。在此示例中,行是系列。
此生成器函数遍历该行中的每个单元格,检查索引4处的字符是否为数字。如果为true,则返回替换字符串的值,否则它将返回单元格本身的值。
def replace_value(row, value):
for cell in row:
if pd.notna(cell) and cell[4].isnumeric():
yield value
else:
yield cell
df.apply(lambda x: pd.Series(replace_value(x, 'myvalue')), axis=1)
然后您将自定义函数逐行应用(axis=1
)并将其包装在lambda中,以便您可以传递其他参数(在这种情况下为value
),然后调用pd.Series
函数返回的iterator
。
希望有道理。
答案 2 :(得分:0)
此答案基于@NomadMonad
string_replacer()是一个将根据满足条件的输入值更改值的函数
def replace_value(row, value):
for cell in row:
try:
if pd.notna(cell) and cell[4].isnumeric():
value=string_replacer(cell)
yield value
else:
yield cell
except:
print(row,value)
if_df.apply(lambda x: pd.Series(replace_value(x,value)), axis=1)