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