我在pandas中有以下数据框:
df = pd.DataFrame({'field_1' : ['a', 'b', np.nan, 'a', 'c'], 'field_2': ['c', 'b', 'a', np.nan, 'c']}, index=[1,2,3,4,5])
我想在整个数据帧上应用以下函数,用其他内容替换每个值。
例如:
def func_replace(value, n):
if value == 'a':
return 'This is a'*n
elif value == 'b':
return 'This is b'*n
elif value == 'c':
return 'This is c'*n
elif str(value) == 'nan':
return np.nan
else:
'The value is not included'
以便最终产品看起来像(n=1
)。
例如:
df = pd.DataFrame({'field_1' : ['This is a', 'This is b', np.nan, 'This is a', 'This is c'], 'field_2': ['This is c', 'This is b', 'This is a', np.nan, 'This is c']}, index=[1,2,3,4,5])
我尝试了以下内容:
df.apply(func_replace, args=(1), axis=1)
和其他一些选项,但它总是给我一个错误。
我知道我可以写一个遍历每一列的for
循环并使用lambda函数来解决这个问题,但我觉得有一个更容易的选择。
我觉得解决方案比我想象的容易,但我无法弄清楚正确的语法。
任何帮助都会非常感激。
答案 0 :(得分:1)
只需将您的功能修改为在Series
中的每个值级别操作,然后使用applymap
。
df = pd.DataFrame({'field_1' : ['a', 'b', np.nan, 'a', 'c'], 'field_2': ['c', 'b', 'a', np.nan, 'c']}, index=[1,2,3,4,5])
df
Out[35]:
field_1 field_2
1 a c
2 b b
3 NaN a
4 a NaN
5 c c
现在,如果我们将函数定义为:
def func_replace(value):
if value == 'a':
return 'This is a'
elif value == 'b':
return 'This is b'
elif value == 'c':
return 'This is c'
elif str(value) == 'nan':
return np.nan
else:
'The value is not included'
对DataFrame
上的每个值调用此函数非常简单:
df.applymap(func_replace)
Out[42]:
field_1 field_2
1 This is a This is c
2 This is b This is b
3 NaN This is a
4 This is a NaN
5 This is c This is c
答案 1 :(得分:0)
我认为你需要:
def func_replace(df, n):
df_temp = df.replace({r"[^abc]": "The value is not included"}, regex=True)
return df_temp.replace(["a", "b", "c"], ["This is a " * n, "This is b " * n, "This is c " * n])
df.apply(func_replace, args=(2,))