DataFrame经循环语句后输出series,期望是按原格式输出DataFrame

import pandas as pd

#定义DataFrame
df = pd.DataFrame(([1,2,3,4],[3,4,5,6],[4,5,6,7]),columns = list('abcd'))

#定义函数
def func(x):
    temp = []
    for i in range(4):
        if x[i] > 3:
            temp.append('over 3')
        else:
            temp.append('under 3')
    return temp

#apply过程
df.apply(func,axis = 1)

#输出的是Series,并不是在原DataFrame格式上修改内容
#期望达到的效果是直接在原DataFrame的格式上对值进行修改
#这里是对触发现象的函数进行了简化,更加具体的函数式在下方已补充

---

这里是补充描述

import pandas as pd

#定义DataFrame
df = pd.DataFrame(([1,0,0,1],[0,0,0,1],[0,1,0,0]),columns = list('abcd'))

#定义函数
def func(x):
    states = []
    for i in range(4):
       
        if x[i] == 0:
            if len(states) > 0:
                if states[i-1] == 'unreg':
                    states.append('unreg')
                else:
                    states.append('unactive')
            else:
                states.append('unreg')
      
        else:
            if len(states) == 0:
                states.append('new')
            else:
                if states[i-1] == 'unactive':
                    states.append('return')
                elif states[i-1] == 'unreg':
                    states.append('new')
                else:
                    states.append('active')
    return states

#对DataFrame使用函数
df.apply(func,axis = 1)

#此时输出的是Series,但我期望的是保留原DataFrame的格式,将原本的数值替换成相应的文本

期望显示的结果如下:

 

谢谢各位大大指路...!

 

 

 

试试这个呢:

df_re = pd.DataFrame(df.apply(func,axis = 1).tolist(),columns= list('abcd'))
Out[27]: 
       a         b         c         d
0    new  unactive  unactive    return
1  unreg     unreg     unreg       new
2  unreg       new  unactive  unactive

 

试试这个:

import pandas as pd
 
#定义DataFrame
df = pd.DataFrame(([1,2,3,4],[3,4,5,6],[4,5,6,7]),columns = list('abcd'))
df_re = df.applymap(lambda x : 'over 3' if x >3 else 'under 3')
Out[34]: 
         a        b        c       d
0  under 3  under 3  under 3  over 3
1  under 3   over 3   over 3  over 3
2   over 3   over 3   over 3  over 3

复杂点:

df_re1 = pd.DataFrame([','.join(i).split(',') for i in df.apply(func,axis = 1)],columns= list('abcd'))