apply用法

大家好,好久不见,再次介绍下本人。中山大学,医学生+计科学生的集合体,机器学习爱好者。
最近发生了好多事,感觉天堂地狱随机切换,最终决定放过自己。感谢gedalao指点。

#一、数据集
data=pd.DataFrame({'A':[1,2,3,4],'B':[5,6,7,8],'C':[9,10,11,12]})
data1=pd.DataFrame({'A':['1_2','2_3','3_4','4_5'],'B':[5,6,7,8],'C':[9,10,11,12]})
data2=pd.DataFrame({'A':['1','2','3','4'],'B':[5,6,7,8],'C':[9,10,11,12]})
data3=pd.DataFrame({'A':['1,2','2,3','3,4','4,5'],'B':[5,6,7,8],'C':[9,10,11,12]})
data4=pd.DataFrame({'1_total_fee':[1,2,3,4],'2_total_fee':[5,6,7,8],'3_total_fee':[9,10,11,12],'4_total_fee':[9,10,11,12]})
data5=pd.DataFrame({'A':[1,2,3,4],'B':[5,5,7,8],'C':[9,10,11,12]})
data6=pd.DataFrame({'A':[0,1,2,3],'B':[5,5,7,8],'C':[9,10,11,12]})

data7=pd.DataFrame({'A':[0,1,2,3],'B':[5,5,7,8],'C':[9,10,11,12]})
print(type(data7['A'][0]))#int64
data7['A']=data7['A'].astype(str)
print(type(data7['A'][0]))#str

data8=pd.DataFrame({'A':['0,1','1,2','2,3','3,4'],'B':[5,5,7,8],'C':[9,10,11,12]})
print(type(data8['A'][0]))#str

data9=pd.DataFrame({'A':['0 1','1 2','2 3','3 4'],'B':[5,5,7,8],'C':[9,10,11,12]})
print(type(data9['A'][0]))#str

data10=pd.DataFrame({'A':['01','12','23','34'],'B':[5,5,7,8],'C':[9,10,11,12]})
print(type(data10['A'][0]))#str

data11=pd.DataFrame({'A':[0,0,2,3],'B':[5,6,7,8],'C':[9,10,11,12]})
data12=pd.DataFrame({'A':[0,0,2,3],'B':[5,5,7,8],'C':[9,10,11,12]})
data13=pd.DataFrame({'A':[['1','2'],['1','3'],['3','1'],['4','5']],'B':[5,6,7,8],'C':[9,10,11,12]})
data14=pd.DataFrame({'A':['12','13','31','45'],'B':[5,6,7,8],'C':[9,10,11,12]})
print(data14)
#     A  B   C
# 0  12  5   9
# 1  13  6  10
# 2  31  7  11
# 3  45  8  12
print(type(data14['A'][0]))#默认字符串里面的类型为str
data14['A']=data14['A'].astype(int)
print(type(data14['A'][0]))#
print(data14)
#     A  B   C
# 0  12  5   9
# 1  13  6  10
# 2  31  7  11
# 3  45  8  12
data14['A']=data14['A'].astype(str)#不能直接加引号变为str,否则在引号内的逗号和引号都会变成元素排列。转为int以后无法排列,因为sort只能排列list里的元素
print(type(data14['A'][0]))#
print(data14)
#     A  B   C
# 0  12  5   9
# 1  13  6  10
# 2  31  7  11
# 3  45  8  12

data15=pd.DataFrame({'A':['1,2','1,3','3,1','4,5'],'B':[5,6,7,8],'C':[9,10,11,12]})
data16=pd.DataFrame({'A':["'1','2'","'1','3'","'3','1'","'4','5'"],'B':[5,6,7,8],'C':[9,10,11,12]})
data17=pd.DataFrame({'ct':[1,1,2,2,3],'1_tf':[10,20,30,40,50]})
co_1f_dict = data17.groupby('ct')['1_tf'].mean().to_dict()
data18=pd.DataFrame({'A':[0,3,2,1],'B':[5,6,6,8],'C':[9,9,9,12]})


用法一:apply(pd.Series.nunique)
nunique()等价于nunique(axis=0)等价于apply(pd.Series.nunique)等价于apply(pd.Series.nunique, axis=0)

def column_types_table(data):
    print('Number of each type of columns:')
    count_dtype = data.dtypes.value_counts().reset_index()#总表每一类别总数,以列为单位
    count_dtype.columns = ['name','total']
    print(count_dtype)

    print('\nNumber of unique classes in each columns:')
    for i in count_dtype['name'].values:
        print('Type: ',i)#计算每一列不同类型的个数

        # 第一种写法:这么写可以不加重复index,因为加了drop=True就变成series了,没法放列名,而不加drop=True,可以加列名又不能去掉重复index。
        # 也就是不使用reset_index来转化为df,直接使用DF,不会多加index。apply(pd.Series.nunique, axis=0)的axis=0可以不加,默认按行,如果等于1,就是按列
        print(DF(data.select_dtypes(i).apply(pd.Series.nunique, axis=0)). \
              sort_values(by=[0], ascending=False).rename(columns={0: 'NUNIQUE'}))  # 按列0排序,没有给名字的时候,转化成df是自动命名01234
        #    NUNIQUE
        # A        4
        # B        3
        # C        2

        # 第二种写法:等价于第一种写法,直接使用DF,不会多加index。
        # nunique()等价于nunique(axis=0)等价于apply(pd.Series.nunique)等价于apply(pd.Series.nunique, axis=0),改成1就是按列。
        print(DF(data.select_dtypes(i).nunique()).sort_values(by=[0], ascending=False).rename(columns={0: 'NUNIQUE'}))
        #    NUNIQUE
        # A        4
        # B        3
        # C        2
column_types_table(data)





用法二:split。
a_b形式,split展开后变成a和b两列。

data1['D'] = data1['A'].apply(lambda x:x.split('_')[0])
print(data1)
#      A  B   C  D
# 0  1_2  5   9  1
# 1  2_3  6  10  2
# 2  3_4  7  11  3
# 3  4_5  8  12  4
data1['E'] = data1['A'].apply(lambda x:x.split('_')[1])
print(data1)
#      A  B   C  D  E
# 0  1_2  5   9  1  2
# 1  2_3  6  10  2  3
# 2  3_4  7  11  3  4
# 3  4_5  8  12  4  5


用法三:数据类型转换。apply(int)

#1、apply(int)
feat_list=['A','B','C']
for feature in feat_list:
    try:
        data[feature] = LabelEncoder().fit_transform(data[feature].apply(int))#apply(int)有啥用?
    except:
        data[feature] = LabelEncoder().fit_transform(data[feature])#数据从0开始编码
    print(data[feature])
print(data)
#    A  B  C
# 0  0  0  0
# 1  1  1  1
# 2  2  2  2
# 3  3  3  3

#1.1、apply(int)
print(type(data2["A"][0]))#
data2["F"] = data2["A"].apply(int)
print(type(data2["F"][0]))#
print(data2)
#    A  B   C  F
# 0  1  5   9  1
# 1  2  6  10  2
# 2  3  7  11  3
# 3  4  8  12  4


#1.2、转list。apply(lambda x:[x])
data['G'] = data['B'].apply(lambda x:[x])
print(data['G'])
# 0    [5]
# 1    [6]
# 2    [7]
# 3    [8]
# Name: G, dtype: object
print(type(data['G'][0]))#


#1.3、用了np能转化为更多类型
data['H'] = data.A  # int默认int64
print(data['H'])
# 0    1
# 1    2
# 2    3
# 3    4
# Name: H, dtype: int64
data['H1'] = data.A.astype(int)  # astype转int是int32
print(data['H1'])
# 0    1
# 1    2
# 2    3
# 3    4
# Name: H1, dtype: int32
data['H2'] = data.A.astype(np.int16)  # np转int16是int16
print(data['H2'])
# 0    1
# 1    2
# 2    3
# 3    4
# Name: H2, dtype: int16

data['I'] = (data.A / data.B) # 默认float64
print(data['I'])
# 0    0.200000
# 1    0.333333
# 2    0.428571
# 3    0.500000
# Name: I, dtype: float64
data['I1'] = (data.A / data.B).astype(float)  # astype(float)也是float64
print(data['I1'])
# 0    0.200000
# 1    0.333333
# 2    0.428571
# 3    0.500000
# Name: I1, dtype: float64
data['I2'] = (data.A / data.B).astype(np.float32)  # np转float32是float32
print(data['I2'])
# 0    0.200000
# 1    0.333333
# 2    0.428571
# 3    0.500000
# Name: I, dtype: float32

data["J"] = data["A"].astype(str)
print(type(data['J'][0]))#


#2、apply(lambda x:type(x)==int)判断是否是int,生成的是bool
data['K'] = data.A.apply(lambda x:type(x)==int)
print(data['K'])
# 0    True
# 1    True
# 2    True
# 3    True
# Name: K, dtype: bool

用法四:根据不同的阈值改变原始值(2018ccf联通)

#1、apply(lambda x: np.log(x) if x > 0 else x)
#更改total_fee分布
for i in range(1, 5):#包括1234
    data4["%d_total_fee" % i] = data4['%d_total_fee' % i].apply(lambda x: np.log(x) if x > 0 else x)#为什么要取对数
    #1234四个月的账单如果小于0就用原始值,大于0取log。
print(data4)
#    1_total_fee  2_total_fee  3_total_fee  4_total_fee
# 0     0.000000     1.609438     2.197225     2.197225
# 1     0.693147     1.791759     2.302585     2.302585
# 2     1.098612     1.945910     2.397895     2.397895
# 3     1.386294     2.079442     2.484907     2.484907


#2、apply(np.log1p)
num_feature=['1_total_fee','2_total_fee','3_total_fee','4_total_fee']
for i in num_feature:
    data4[i] = data4[i].apply(np.log1p)
print(data4)
#    1_total_fee  2_total_fee  3_total_fee  4_total_fee
# # 0     0.000000     0.959135     1.162283     1.162283
# # 1     0.526589     1.026672     1.194706     1.194706
# # 2     0.741276     1.080418     1.223156     1.223156
# # 3     0.869742     1.124748     1.248441     1.248441


#3、apply(lambda x: 0 if x < 0 else x)
data4["1_total_fee_add1"] = data4["1_total_fee"].apply(lambda x: 0 if x < 0 else x)
print(data4)
#    1_total_fee  2_total_fee        ...         4_total_fee  1_total_fee_add1
# 0     0.000000     0.959135        ...            1.162283          0.000000
# 1     0.526589     1.026672        ...            1.194706          0.526589
# 2     0.741276     1.080418        ...            1.223156          0.741276
# 3     0.869742     1.124748        ...            1.248441          0.869742
num_feature.extend(['1_total_fee_add1'])
print(num_feature)#['1_total_fee', '2_total_fee', '3_total_fee', '4_total_fee', '1_total_fee_add1']
##extend与append方法的相似之处在于都是将新接收到参数放置到已有列表的后面。而extend方法只能接收list,且把这个list中的每个元素添加到原list中。
## >>> a.extend('55')
## >>> a
## [11,22,33,44,'5','5']
## 因为extend只接收list,所以将其拆分


#4、apply(lambda x: 1 if x > 0 else 0)
data4["1_total_fee_add2"] = data4["1_total_fee"].apply(lambda x: 1 if x > 0 else 0)
print(data4)
#    1_total_fee        ...         1_total_fee_add2
# 0     0.000000        ...                        0
# 1     0.526589        ...                        1
# 2     0.741276        ...                        1
# 3     0.869742        ...                        1
data4["1_total_fee_add3"]= data4["1_total_fee"].apply(lambda x: 0 if 6 < x <= 12 else (1 if 12 < x <= 18 else 2))
print(data4)
#    1_total_fee        ...         1_total_fee_add3
# 0     0.000000        ...                        2
# 1     0.526589        ...                        2
# 2     0.741276        ...                        2
# 3     0.869742        ...                        2


#5、apply(lambda x:-1 if x==r'\N' or x==r'\\N'  else x)
# 填补缺失值
data4['1_total_fee_add4']=data4['1_total_fee'].apply(lambda x:-1 if x==r'\N' or x==r'\\N'  else x)
print(data4)
#    1_total_fee        ...         1_total_fee_add4
# 0     0.000000        ...                 0.000000
# 1     0.526589        ...                 0.526589
# 2     0.741276        ...                 0.741276
# 3     0.869742        ...                 0.869742

用法五:调用已定义的函数

#1、一个变量。apply(Rate_diff_1_fee_up)等价于apply(lambda x:Rate_diff_1_fee_up(x))
def Rate_diff_1_fee_up(total_fee):
    if total_fee < 5:
        return (5 - total_fee) / 5
    elif total_fee >= 5 and total_fee < 19:
        return (19 - total_fee) / 19
    elif total_fee >= 398:
        return (total_fee - 398) / 398
data4['rate_diff_1_fee_up'] = data4['1_total_fee'].apply(Rate_diff_1_fee_up)
print(data4)
#    1_total_fee  2_total_fee         ...          4_total_fee  rate_diff_1_fee_up
# 0            1            5         ...                    9                 0.8
# 1            2            6         ...                   10                 0.6
# 2            3            7         ...                   11                 0.4
# 3            4            8         ...                   12                 0.2
data4['rate_diff_1_fee_up_1'] = data4['1_total_fee'].apply(lambda x:Rate_diff_1_fee_up(x))#与上面一行等价
print(data4)
#    1_total_fee          ...           rate_diff_1_fee_up_1
# 0            1          ...                            0.8
# 1            2          ...                            0.6
# 2            3          ...                            0.4
# 3            4          ...                            0.2


#2、两个变量。apply(lambda row: traffic_fee(row['service_type'], row['month_traffic']), axis=1)
def traffic_fee(service_type, month_traffic):
    if service_type == 1:
        return month_traffic / 800
    else:
        return month_traffic * 0.3
data4['month_traffic_fee'] = data4.apply(lambda row: traffic_fee(row['1_total_fee'], row['2_total_fee']), axis=1)
print(data4)
#    1_total_fee        ...          month_traffic_fee
# 0            1        ...                    0.00625
# 1            2        ...                    1.80000
# 2            3        ...                    2.10000
# 3            4        ...                    2.40000

def is_trafficzero_time_notzero(online_time, month_traffic):
    if month_traffic == 0 and online_time != 0:
        return 1
    else:
        return 0
data4['is_trafficzero_time_notzero'] = data4.apply(lambda row: is_trafficzero_time_notzero(row['1_total_fee'], row['2_total_fee']), axis=1)
print(data4)
#    1_total_fee             ...               is_trafficzero_time_notzero
# 0            1             ...                                         0
# 1            2             ...                                         0
# 2            3             ...                                         0
# 3            4             ...                                         0

用法六:最大最小均值计数。max(),apply(max),apply(lambda x: np.mean(x))

#1、最小
data3['A1']=data3['A'].apply(lambda x:x.split(','))
print(data3)
#      A  B   C      A1
# 0  1,2  5   9  [1, 2]
# 1  2,3  6  10  [2, 3]
# 2  3,4  7  11  [3, 4]
# 3  4,5  8  12  [4, 5]


data3['A1_min'] = data3['A1'].apply(min)#apply是对紧接着的对象的值操作。此处对象是list,list里面的空格和逗号只是list的一种表现方式,不是元素
print(data3)
#      A  B   C      A1 A1_min
# 0  1,2  5   9  [1, 2]     2
# 1  2,3  6  10  [2, 3]     3
# 2  3,4  7  11  [3, 4]     4
# 3  4,5  8  12  [4, 5]     5
data3['A_min'] = data3['A'].apply(min)#apply是对紧接着的对象的值操作。此处对象是str,逗号和空格也是元素
print(data3)
#      A  B   C      A1 A1_min A_min
# 0  1,2  5   9  [1, 2]      1     ,
# 1  2,3  6  10  [2, 3]      2     ,
# 2  3,4  7  11  [3, 4]      3     ,
# 3  4,5  8  12  [4, 5]      4     ,


data3['A_min_1'] = data3['A'].min()#min是pandas的,对整个series或df操作,比较整个series或df的大小
print(data3)
#      A  B   C      A1 A1_min A_min A_min_1
# 0  1,2  5   9  [1, 2]      1     ,     1,2
# 1  2,3  6  10  [2, 3]      2     ,     1,2
# 2  3,4  7  11  [3, 4]      3     ,     1,2
# 3  4,5  8  12  [4, 5]      4     ,     1,2


data3['A1_min_1.0']=data3['A1'].apply(lambda x: np.min(np.array(x).astype(int)))#np.min()只能对int、float等最基本数据类型操作
print(data3)
print(type(data3['A1_min_1.0'][0]))#
#      A  B   C      A1 A1_min A_min A_min_1  A1_min_1.0
# 0  1,2  5   9  [1, 2]      1     ,     1,2           1
# 1  2,3  6  10  [2, 3]      2     ,     1,2           2
# 2  3,4  7  11  [3, 4]      3     ,     1,2           3
# 3  4,5  8  12  [4, 5]      4     ,     1,2           4

data3['A1_min_1.1']=data3['A1'].apply(lambda x: np.min(np.array(x)))#np.min()#报错。只能对int、float等最基本数据类型操作
print(data3)
print(type(data3['A1_min_1.1'][0]))


data3['A1_min_1.2']=data3['A1'].apply(lambda x: np.min(x))#np.min()#报错。只能对int、float等最基本数据类型操作,此时data3['A1']的值是list
print(data3)
print(type(data3['A1_min_1.2'][0]))


data3['A_min_1.0']=data3['A'].apply(lambda x: np.min(np.array(x).astype(int)))#报错。只能对int、float等最基本数据类型操作,此时data3['A']的值是array
print(data3)


data3['A_min_1.1']=data3['A'].apply(lambda x: np.min(x))#np.min()#报错。只能对int、float等最基本数据类型操作,此时data3['A']的值是str
print(data3)
print(type(data3['A_min_1.1'][0]))


data3['A1_array_int']=data3['A1'].apply(lambda x: np.array(x).astype(int))
print(data3)
print(type(data3['A1_array_int'][0]))#。此时指代的是array
print(type(data3['A1_array_int'][0][0]))#。此时指代的是array里的元素
#      A  B   C      A1 A1_min A_min A_min_1  A1_min_1.0 A1_array_int
# 0  1,2  5   9  [1, 2]      1     ,     1,2           1       [1, 2]
# 1  2,3  6  10  [2, 3]      2     ,     1,2           2       [2, 3]
# 2  3,4  7  11  [3, 4]      3     ,     1,2           3       [3, 4]
# 3  4,5  8  12  [4, 5]      4     ,     1,2           4       [4, 5]


data3['A1_array']=data3['A1'].apply(lambda x: np.array(x))
print(data3)
print(type(data3['A1_array'][0]))#
#      A  B   C      A1    ...    A_min_1 A1_min_1.0 A1_array_int  A1_array
# 0  1,2  5   9  [1, 2]    ...        1,2          1       [1, 2]    [1, 2]
# 1  2,3  6  10  [2, 3]    ...        1,2          2       [2, 3]    [2, 3]
# 2  3,4  7  11  [3, 4]    ...        1,2          3       [3, 4]    [3, 4]
# 3  4,5  8  12  [4, 5]    ...        1,2          4       [4, 5]    [4, 5]


#2、均值
data3['A_mean'] = data3['A1'].apply(lambda x: np.mean(np.array(x).astype(int)))
print(data3)
#      A  B   C      A1  A_mean
# 0  1,2  5   9  [1, 2]     1.5
# 1  2,3  6  10  [2, 3]     2.5
# 2  3,4  7  11  [3, 4]     3.5
# 3  4,5  8  12  [4, 5]     4.5


#3、计数
data3['A1_0_times'] = data3['B'].apply(lambda x: x.count(0))#data3['A1']这一列值为0的次数。报错
print(data3)






用法七:元素选择

#一、对series做元素选择
a=data5["A"][:-1]#[:-1]是对整个series处理,data["A"]是个series。使用apply是对series的每一个值处理,就无法执行[:-1]
print(a)
# 0    1
# 1    2
# 2    3
# Name: A, dtype: int64
b=data5["A"][-1:]
print(b)
# 3    4
# Name: A, dtype: int64

c=data5["A"][1]
print(c)
# 2
d=data5["A"][-1]#报错
print(d)


e=data5["A"][1:]
print(e)
# 1    2
# 2    3
# 3    4
# Name: A, dtype: int64
f=data5["A"][:1]
print(f)
# 0    1
# Name: A, dtype: int64


#二、使用apply做元素选择,相当于对每一个值处理.apply是pandas特有的,只能对series和df操作
#1、序列值(x[-3:])用于单值(A列是单值)
data5["G"]=data5["A"].apply(lambda x:x[-3:])#报错
#apply相当于对data5['A']中的每一个值操作,所以无法进行x[n:]这种需要超过一个数字的操作。


#2、单值(x[1])用于单值int(A列是单值int)
data5["H"]=data["A"].apply(lambda x:1 if x[0] else 0)#报错
#data5['A']中的每一个值都为int(或float),此时x代表具体的值,即int(或float)。int(或float)是数据的最基本类型,无法拆分。


#3、单值(x[1])用于单值str(A列是单值str)
data7["I"]=data7["A"].apply(lambda x:x[0])
print(data7)
# data7['A']中的每一个值是str,str可以包括int或float等基本类型,此时x代表地址,x[0]代表从地址第一个位置起向后移动0位,
# 即从str的第一个位置起向后移动0位,即这一列每一行的第一个元素
#    A  B   C   I
# 0  0  5   9   0
# 1  1  5  10   1
# 2  2  7  11   2
# 3  3  8  12   3


#4、单值(x[1])用于多值str(A列是多值str)
data8["J"]=data8["A"].apply(lambda x:x[1])
print(data8)
# data8['A']中的每一个值是str,str可以包括int或float等基本类型,此时x代表地址,x[1]代表从地址第一个位置起向后移动一位,
# 即从str的第一个位置起向后移动一位,即这一列每一行的第二个元素,逗号也属于元素
#      A  B   C        J
# 0  0,1  5   9        ,
# 1  1,2  5  10        ,
# 2  2,3  7  11        ,
# 3  3,4  8  12        ,

data9["K"]=data9["A"].apply(lambda x:x[1])
print(data9)
# data9['A']中的每一个值是str,str可以包括int或float等基本类型,此时x代表地址,x[1]代表从地址第一个位置起向后移动一位,
# 即从str的第一个位置起向后移动一位,即这一列每一行的第二个元素,空格也属于元素
#      A  B   C    K
# 0  0 1  5   9
# 1  1 2  5  10
# 2  2 3  7  11
# 3  3 4  8  12


data10["L"]=data10["A"].apply(lambda x:x[1])
# data9['A']中的每一个值是str,str可以包括int或float等基本类型,此时x代表地址,x[1]代表从地址第一个位置起向后移动一位,即从str的第一个位置起向后移动一位,即这一列每一行的第二个元素
print(data10)
#     A  B   C        L
# 0  01  5   9        1
# 1  12  5  10        2
# 2  23  7  11        3
# 3  34  8  12        4


#5、list、tuple、array需要定位元素,直接加[0]
a=data5["A"].tolist().apply(lambda x:x[0])#报错
# AttributeError: 'list' object has no attribute 'apply'
b=data5["A"].tolist()
c=tuple(data5['A'])
d=np.array(data5['A'])
print(b[1])#2
print(c[1])#2
print(d[1])#2
#list、tuple、array需要定位元素,直接加[0]。此时x代表地址,x[0]代表从地址第一个位置起向后移动0位,
# 即从list、tuple、array的第一个位置起向后移动0位,即list、tuple、array中第一个元素

#6、iloc定位
d = data17[['ct']].apply(lambda x: x.iloc[0], axis=1)
print(d)
# 0    1
# 1    1
# 2    2
# 3    2
# 4    3
# dtype: int64
d1 = data17[['ct']].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(d1)
# 0    15
# 1    15
# 2    35
# 3    35
# 4    50
# dtype: int64


e = data17['ct'].apply(lambda x: x.iloc[0], axis=1)
print(e)
e1 = data17['ct'].apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(e1)
#报错


f = data17['ct'].reset_index(drop=True).apply(lambda x: x.iloc[0], axis=1)
print(f)
f1 = data17['ct'].reset_index(drop=True).apply(lambda x: co_1f_dict[x.iloc[0]], axis=1)
print(f1)
#报错


#7、下标定位
list_data18=[111,222,333,444]
data18['E']=data18['A'].apply(lambda x:list_data18[x])
print(data18['E'])
# 0    111
# 1    444
# 2    333
# 3    222
# Name: E, dtype: int64

data18['F']=data18['A'].apply(lambda x:list_data18[x-1])
print(data18['F'])
# 0    444
# 1    333
# 2    222
# 3    111
# Name: F, dtype: int64

data18['G']=pd.DataFrame(list_data18)
print(data18['G'])
# 0    111
# 1    222
# 2    333
# 3    444
# Name: G, dtype: int64

print(data18)
#    A  B   C    E    F    G
# 0  0  5   9  111  444  111
# 1  3  6   9  444  333  222
# 2  2  6   9  333  222  333
# 3  1  8  12  222  111  444


用法八:list拼接

data8['D']= data8['A'].apply(lambda x: str(x).split(','))#空格分开
print(data8['D'])
print(data8)
# 0    [0, 1]
# 1    [1, 2]
# 2    [2, 3]
# 3    [3, 4]
data8['E']= data8['A'].apply(lambda x: x.split(','))#本来多值就是字符串,不需要写成str(x).split()
print(data8['E'])
print(data8)
# 0    [0, 1]
# 1    [1, 2]
# 2    [2, 3]
# 3    [3, 4]


data8['M'] = data8['D'].apply(lambda x: ' '.join(x))
print(data8)
apps = data8['D'].apply(lambda x: ' '.join(x)).tolist()#用空格相连,还是不同list分开的
print(apps)


b = data11.groupby('A').apply(lambda x: x.B.tolist())#groupby后的元素拼接成一个list
print(b)
# A
# 0    [5, 6]
# 2       [7]
# 3       [8]
# dtype: object


b = data11.groupby('A').B.sum()
print(b)
# A
# 0    11
# 2     7
# 3     8
# Name: B, dtype: int64


b = data12.groupby('A').B.apply(list)#groupby后的元素拼接成一个list
print(b)
# A
# 0    [5, 5]
# 2       [7]
# 3       [8]
# Name: B, dtype: object
b = data12.groupby('A').B.apply(set)#groupby后的元素拼接成一个set,set是不重复元素的集合。集合会去掉重复元素,可以用集合除以list,代表重复元素的比例
print(b)
# A
# 0    {5}
# 2    {7}
# 3    {8}
# Name: B, dtype: object


用法九、mode的使用:可用于series、df。不看用于seriesgroupby

#1、赋值为随意变量
a = data5.groupby("A").B.apply(lambda x: mode(x))#返回tuple
print(a)
# A
# 1    ([5], [1])
# 2    ([5], [1])
# 3    ([7], [1])
# 4    ([8], [1])
# Name: B, dtype: object


b = data6.groupby("A").B.apply(lambda x: mode(x))#返回tuple
print(b)
# A
# 0    ([5], [1])
# 1    ([5], [1])
# 2    ([7], [1])
# 3    ([8], [1])
# Name: B, dtype: object


#2、赋值为data新列
data5['D'] = data5.groupby("A").B.apply(lambda x: mode(x))
print(data5)
#返回tuple。以索引列拼接,a的索引列为1234,data的索引列为0123,所以data['D']保留共同列123,有nan
#    A  B   C           D
# 0  1  5   9         NaN
# 1  2  5  10  ([5], [1])
# 2  3  7  11  ([5], [1])
# 3  4  8  12  ([7], [1])


data6['D'] = data6.groupby("A").B.apply(lambda x: mode(x))
print(data6)
#返回tuple。以索引列拼接,b的索引列为0123,data的索引列为0123,所以data6['D']保留共同列0123,无nan。
#对主键(唯一id)做groupby,mode后无nan;若有重复值的一列做groupby,mode后会有nan,只能先不赋值给data['new'],赋值给随便一个变量a,再与原数据集进行merge
#    A  B   C           D
# 0  0  5   9  ([5], [1])
# 1  1  5  10  ([5], [1])
# 2  2  7  11  ([7], [1])
# 3  3  8  12  ([8], [1])


#3、赋值为data新列
data5['E'] = data5.groupby("A").B.apply(lambda x: mode(x)[0][0])
print(data5)
# 第一个[0]代表tuple的第一个元素,tuple的元素为list,第二个[0]代表list第一个元素
#    A  B   C           D    E
# 0  1  5   9         NaN  NaN
# 1  2  5  10  ([5], [1])  5.0
# 2  3  7  11  ([5], [1])  5.0
# 3  4  8  12  ([7], [1])  7.0


data6['E'] = data6.groupby("A").B.apply(lambda x: mode(x)[0][0])
print(data6)
# 第一个[0]代表tuple的第一个元素,tuple的元素为list,第二个[0]代表list第一个元素
#    A  B   C           D  E
# # 0  0  5   9  ([5], [1])  5
# # 1  1  5  10  ([5], [1])  5
# # 2  2  7  11  ([7], [1])  7
# # 3  3  8  12  ([8], [1])  8


print(type(data5['E'][0]))#nan是float类型。一列里面有int有float会统一变为float


用法十、groupby

#1、赋值为data新列
data5['order_dow_mode'] = data5.groupby("A").B
print(data5)
#    A  B   C order_dow_mode
# 0  1  5   9       (1, [5])
# 1  2  5  10       (2, [5])
# 2  3  7  11       (3, [7])
# 3  4  8  12       (4, [8])
#若groupby中A的键有重复的会报错,shape不match


#2、赋值为随意变量
a = data5.groupby("A").B
print(type(a))#
print(a)# 


#3、赋值为随意变量
a = data5.groupby("A").B.count()
print(type(a))#


#4、赋值为随意变量,seriesgroupby直接转化为df,用apply相当于把B列每个元素都转换成df再拼接为一个大df。这个操作无意义
a = data5.groupby('A').B.apply(pd.DataFrame)
print(a)
#      1    2    3    4
# 0  5.0  NaN  NaN  NaN
# 1  NaN  5.0  NaN  NaN
# 2  NaN  NaN  7.0  NaN
# 3  NaN  NaN  NaN  8.0


#5、赋值为随意变量,seriesgroupby直接转化为df,转成df后可以进行mode等操作
a = data5.groupby('A').B.apply(pd.DataFrame).mode()
print(a)
#      1    2    3    4
# 0  5.0  5.0  7.0  8.0
#nan不算众数


#6、赋值为随意变量,seriesgroupby直接转化为series,用apply相当于把B列每个元素都转换成series再拼接为一个大series
a = data5.groupby('A').B.apply(pd.Series)
print(a)
# 0    5
# 1    5
# 2    7
# 3    8
# Name: B, dtype: int64


#7、赋值为随意变量,seriesgroupby直接转化为series,转成series后可以进行reset_index等操作
a = data5.groupby('A').B.apply(pd.Series).reset_index()
print(a)
#    index  B
# 0      0  5
# 1      1  5
# 2      2  7
# 3      3  8


#8、赋值为随意变量,seriesgroupby直接转化为series,转成series后可以进行mode等操作
a = data5.groupby('A').B.apply(pd.Series).mode()
print(a)
# 0    5
# dtype: int64


#9、赋值为随意变量,seriesgroupby直接转化为series,再转成df,不增加新index的方法就是加DF(已总结过)
from pandas import DataFrame as DF
a = DF(data5.groupby('A').B.apply(pd.Series))
print(a)
#    B
# 0  5
# 1  5
# 2  7
# 3  8

#10、赋值为随意变量,seriesgroupby直接转化为df,不使用apply会报错
a = DF(data5.groupby('A').B)#报错
print(a)


#11、整体求众数
data50=data5.mode() # 求data每一列的众数,写在第一行,其余填补nan。data=data.mode()等价于data.mode()等价于a=data.mode()
print(data50)
#    A    B   C
# 0  1  5.0   9
# 1  2  NaN  10
# 2  3  NaN  11
# 3  4  NaN  12

用法十一:i for i in

a=data4.apply(lambda x:'total_fee' in x)
print(a)
# 1_total_fee    False
# 2_total_fee    False
# 3_total_fee    False
# 4_total_fee    False
# dtype: bool


b = data3[data3['A'].apply(lambda x: 'total_fee' not in x)]#data3['A']这一列保留这一列的值没有'total_fee'字段的部分,按行遍历
print(b)
#      A  B   C      A1
# 0  1,2  5   9  [1, 2]
# 1  2,3  6  10  [2, 3]
# 2  3,4  7  11  [3, 4]
# 3  4,5  8  12  [4, 5]


w2v1234f_num=[i for i in data4.columns if 'total_fee' in i]
print(w2v1234f_num)#['1_total_fee', '2_total_fee', '3_total_fee', '4_total_fee']


用法十二:sort的用法。list没有apply,但sort是对list里的元素排序

data14["A2"] = data14["A"].apply(lambda x: sorted(x))#data14["A"]是list,sort对list里面的元素进行排序
print(data14)
#     A  B   C      A2
# 0  12  5   9  [1, 2]
# 1  13  6  10  [1, 3]
# 2  31  7  11  [1, 3]
# 3  45  8  12  [4, 5]
data15["A3"] = data15["A"].apply(lambda x: sorted(x))#data15["A"]是list,sort对list里面的元素进行排序,逗号也属于元素
print(data15)
#      A  B   C         A3
# 0  1,2  5   9  [,, 1, 2]
# 1  1,3  6  10  [,, 1, 3]
# 2  3,1  7  11  [,, 1, 3]
# 3  4,5  8  12  [,, 4, 5]
data16["A4"] = data16["A"].apply(lambda x: sorted(x))#data16["A"]是list,sort对list里面的元素进行排序,四个单引号和一个逗号也属于元素
print(data16)
#          A  B   C                     A4
# 0  '1','2'  5   9  [', ', ', ', ,, 1, 2]
# 1  '1','3'  6  10  [', ', ', ', ,, 1, 3]
# 2  '3','1'  7  11  [', ', ', ', ,, 1, 3]
# 3  '4','5'  8  12  [', ', ', ', ,, 4, 5]


data13['E'] = data13.groupby("A").B.apply(lambda x: np.bincount(x).argmax())  #多值投票取众数。语法似乎还有点问题。??
print(data13)


用法十三:a=data[i]和temp[i]=data[i]

#modf处理后原始数据变成float
data['xiaoshu']=data['A'].apply(lambda x:math.modf(x)[0])#data['A']的小数部分
print(data['xiaoshu'])
data['zhengshu']=data['A'].apply(lambda x:math.modf(x)[1])#data['A']的整数部分
print(data['zhengshu'])
#      A    B     C  xiaoshu  zhengshu
# 0  1.0  5.0   9.0      0.0       1.0
# 1  2.0  6.0  10.0      0.0       2.0
# 2  3.0  7.0  11.0      0.0       3.0
# 3  4.0  8.0  12.0      0.0       4.0


b=pd.DataFrame()
for i in data.columns:
    a=pd.DataFrame(data[i].apply(lambda x: math.modf(x)[0]))#只处理了一列。[0]代表所有数字的小数部分,[1]代表所有数字的整数部分
    b=pd.concat([b,a],axis=1)#所以要把每一列concat拼接起来
print(b)

#更为简便,等价于上一种写法
temp=pd.DataFrame()
for i in data.columns:
    temp[i]=data[i].apply(lambda x: math.modf(x)[0])#处理了所有列
print(temp)


用法十四:map

#map用法
data3["best_none"]=map(lambda a:f1.maximize_expectation(a),data["label_list"])
data3["best_none"]=data["label_list"].map(lambda a:f1.maximize_expectation(a))#等价于上面的

你可能感兴趣的:(计算机基础,Yukyin,python入门)