大家好,好久不见,再次介绍下本人。中山大学,医学生+计科学生的集合体,机器学习爱好者。
最近发生了好多事,感觉天堂地狱随机切换,最终决定放过自己。感谢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))#等价于上面的