不知道小伙伴们学习python的dataframe时,是否遇到一个疑惑,apply参数axis的具体含义是什么?
官方文档解释如下:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html
axis{0 or ‘index’, 1 or ‘columns’}, default 0
Axis along which the function is applied:
0 or ‘index’: apply function to each column.
1 or ‘columns’: apply function to each row.
也就是说,0代表按列,1代表按行
例如我的数据
import pandas as pd
tf = pd.read_csv(filepath)
sharein 0_country 1_country 2_country
0 1 USA USA NaN
1 2 France France Czech Republic
2 1 Australia Australia NaN
3 2 USA France France
4 2 USA France France
5 1 China China NaN
6 1 China China NaN
7 1 China China NaN
8 1 China China NaN
9 1 China China NaN
10 1 USA USA NaN
11 1 USA USA NaN
12 2 USA China USA
13 1 China China NaN
14 1 China China NaN
15 1 China China NaN
16 1 China China NaN
tf = tf.fillna("0")
首先我构建一个函数来计算
def count(n):
n1 = n.unique()#unique函数仅针对序列,df[]表示序列,df[[]]表示dataframe
n2 = len(list(n1))
if "0" in n1 :
n2-=1
return n2
显然,我的函数的目的在于按行对于tf进行操作,那我们设置axis = 1,来我们看一下结果
tf.apply(count,axis = 1)
0 1
1 2
2 1
3 2
4 2
5 1
6 1
7 1
8 1
9 1
10 1
11 1
12 2
13 1
14 1
15 1
16 1
正如我们预期一样,那我们再看另一个例子
tf1 = pd.read_csv(r"pathname")
>>> tf1
type affitype
0 1 2
1 2 3
2 1 1
3 2 3
4 2 3
5 1 1
6 1 1
7 1 2
8 1 1
9 1 1
10 1 1
11 1 1
12 2 2
13 1 2
14 1 2
15 1 2
16 1 2
我想根据以上两列满足一定的条件,然后新增列并且赋值,具体函数如下:
def define_type(i1,i2):
if i1 > 1:
t = "inte"
elif i1 == 1 and i2 == 1:
t = "in_a"
else:
t = "in_n"
return t
显然,此时我们是按列传入函数,应该用axis = 0,我们看看结果
tf1["Type"] = tf1.apply(lambda i:define_type(i["type"],i["affitype"]),axis = 0)
Traceback (most recent call last):
File "", line 1, in
tf1["Type"] = tf1.apply(lambda i:define_type(i["type"],i["affitype"]),axis = 0)
File "E:\py\lib\site-packages\pandas\core\frame.py", line 6487, in apply
return op.get_result()
_____
KeyError: ('type', 'occurred at index type')
结果显示报错,我又百度一番,发现此时设置axis = 1就得到我们想要的结果了
tf1["Type"] = tf1.apply(lambda i:define_type(i["type"],i["affitype"]),axis = 1)
>>> tf1["Type"]
0 in_n
1 inte
2 in_a
3 inte
4 inte
5 in_a
6 in_a
7 in_n
8 in_a
9 in_a
10 in_a
11 in_a
12 inte
13 in_n
14 in_n
15 in_n
16 in_n
Name: Type, dtype: object
我猜大概是和我们输入的参数类型有关吧,第一个是整个dataframe传入函数,后面这个是传入Series,没有进一步细究。