相关文章推荐
谦虚好学的口罩  ·  MySQL ...·  1 年前    · 
很拉风的单杠  ·  Day13 ...·  1 年前    · 

lambda&if映射修改列数据

records_df['Name'] = records_df['Name'].apply(lambda x: '基金' if x is None else x)
records_df['Industry'] = records_df['Industry'].apply(lambda x: '公募基金' if x is None else x)
# 新增列columns_screencode
data_s['columns_screencode'] = data_s['筛查编号'].map(lambda x:list(json.loads(x).keys())) #新增一列'columns'用于存储每一列的json串的字段名

找出list中指定元素的所有索引

a=[72, 56, 76, 84, 80, 88, 76]
list(enumerate(a))
[i for i, x in enumerate(a) if x==76]  # 利用enumerate函数可以一个不漏找出list中指定元素的所有索引

筛选两列内容不一致的行数据

# 分别筛选AI与Doc结论一致标签的行数据以及AI与Doc结论不一致标签的行数据
df_base_same = df_base_unique.loc[lambda x:x['AIDiagnosis_label'] == x['DocDiagnosis_label']]
df_base_different = df_base_unique.loc[lambda x:x['AIDiagnosis_label'] != x['DocDiagnosis_label']]
df_last.apply(lambda x : x['AIDiagnosis_label'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)

DataFrame 根据多列的值做判断,利用lambda生成新的列值

主要是DataFrame.apply函数的应用,如果设置axis参数为1则每次函数每次会取出DataFrame的一行来做处理,如果axis为1则每次取一列。

如代码所示,判断如果城市名中含有ing字段且年份为2016,则新列test值赋为1,否则为0.

import numpy as np
import pandas as pd
data = {'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou', 'Chongqing'],
       'year': [2016,2016,2015,2017,2016, 2016],
       'population': [2100, 2300, 1000, 700, 500, 500]}
frame = pd.DataFrame(data, columns = ['year', 'city', 'population', 'debt'])
def function(a, b):
	if 'ing' in a and b == 2016:
		return 1
	else:
		return 0
print(frame, '\n')
frame['test'] = frame.apply(lambda x: function(x.city, x.year), axis = 1)
print(frame)

典型范例:

# 根据两列的结果利用lambda整合单列的标签值
def function(a, b):
    if pd.isnull(b) == True or b =='empty' or b =='no' or b =='invalid':
        return a
    else:
        return b
print(df.loc[:5,['img_md','sImageMd5']], '\n')   
df['img_md'] = df.apply(lambda x: function(x['sImageMd5'], x['img_md']) , axis = 1)
print(df.loc[:5,['img_md','sImageMd5']], '\n')  
# 根据两列的结果利用lambda整合单列的标签值
import numpy as np
import pandas as pd
def function_two(a, b):
    if pd.isnull(b)==True:
        return a
    else:
        return b
print(df.loc[:5,['deviceversion','nTagCheckDevice']], '\n') 
df['deviceversion'] = df_znai.apply(lambda x: function_two(x['nTagCheckDevice'], x['deviceversion']), axis = 1)
print(df.loc[:5,['deviceversion','nTagCheckDevice']], '\n') 

series使用lambda表达式

另外Series类型也有apply函数,用法示例如下:

import numpy as np
import pandas as pd
data = {'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Hangzhou', 'Chongqing'],
       'year': [2016,2016,2015,2017,2016, 2016],
       'population': [2100, 2300, 1000, 700, 500, 500]}
frame = pd.DataFrame(data, columns = ['year', 'city', 'population', 'debt'])
print(frame, '\n')
frame['panduan'] = frame.city.apply(lambda x: 1 if 'ing' in x else 0)
print(frame)

参考链接:pandas DataFrame 根据多列的值做判断,生成新的列值

根据DataFrame某列的值利用lambda修改另一列的值

df_source_pros['entityID'] = df_source_pros.apply(lambda x: entity_id_dict[x['entity']],axis=1)
# 利用DataFrame多列的值特征修改另一列的值
df_source_pros['value'] = df_source_pros.apply(lambda x: x['entity'] if x['property']=='name' else '',axis=1)
# 为实体的属性为“name”的行数据补全value值,满足x['property']=='name'取A列的值,否则取B列的值。
df_source_pros['value'] = df_source_pros.apply(lambda x: x['entity'] if x['property']=='name' else x['value'],axis=1)
def function_two(a, b):
    if pd.isnull(b)==True:
        return a
    else:
        return b
df_check['doc_result'] = df_check.apply(lambda x: function_two(json.loads(x['result'])['image_description'],json.loads(x['result'])['read_result']) 
							     if ('read_result' in json.loads(x['result']).keys()) 
							     else json.loads(x['result'])['image_description'] , axis=1)

lambda和for循环的嵌套使用

将DataFrame中所有列中列类型为float,且不为空的行数据全部转为整型,其他不变。

1. Python查看某一列series的数据类型——series.dtypes

'float' in str(df_patient_info['origin_patient_id'].dtypes)  # 正常输出dtype('int64'),通过str()转为字符型“float64”

2. Python查看某一对应obj的数据类型——isinstance(XXX,float)

isinstance(df_patient_info.loc[98,'isinfant'],float) and pd.notnull(df_patient_info.loc[98,'isinfant'])

3. lambda和for循环的嵌套使用

完整示例:

for g in df_patient_info.columns.to_list():
    df_patient_info[g] = df_patient_info[g].apply(lambda x: int(x) if (isinstance(x,float) and pd.notnull(x)) else x)
                                    正则表达式(regular expression)是一种用形式化语法描述的文本匹配模式。在需要处理大量文本处理的应用中有广泛的使用,我没使用的编辑器,IDE中的搜索常用正则表达式作为搜索模式。玩过*nix系统的都知道如sed,grep,awk这类的命令,他们是非常强大的文本处理工具。几乎所有的语言都有对正则表达式的支持,有的直接在语法中支持,有的使用扩展库的形式。python使用的就是扩展库re。
    re.search(pattern,string,flag=0)
    搜索文本中的匹配的模式是最常用的.以模式和文本作为输入,如果有匹配则返回一个Match对象,反之返回None。
data原始数据:
data[map(lambda x:datetime.date(x.year-1,x.month,x.day),data['report_date'])==data['date_1y_ago']]
 company_id signal_code_x signal_value_x report_date signal_code_y signal_value_y report_date_last date_1y_ago
0  2154888 r_
# 1.lambda表达式
# 1.1 dataframe对【单列操作】
data['label'] = data['score'].apply(lambda x: 1 if x>=1.0 else 0)
# 1.2 dataframe操作某列,对【多列操作】
da...
3、根据现有列计算生成新的列
dataframe 根据某列的值生成新的列
df2[‘是否逾期’]=df2.apply(lambda x:0 if x.应付日期>today_time else 1,axis=1)
df2[‘是否到期90天’]=(today_time - 
import pandasas pd
df = pd.DataFrame({i: [j*i for j in range(1,101)] for i in range(1,97)})
df = df.apply(lambda x: x * df.index.to_series(), axis=0)
上面的代码首先创建了一个名为"df"...
                                    文章目录1、连接本地spark2.、创建dataframe3、 选择和切片筛选4、增加删除列5、排序6、处理缺失值7、分组统计8、join操作9、空值判断10、离群点11、去重12、 生成新列13、行的最大最小值14、when操作
1、连接本地spark
import pandas as pd
from pyspark.sql import SparkSession
spark = SparkSession \
    .builder \
    .appName('my_first_app_name'
                                    lambda 函数是匿名函数——您不使用关键字编写的函数def。一个 lambda 函数可以接受多个参数,但它只能有一个表达式。既然你没有用关键字定义一个lambda函数def,你怎么调用它?您可以将 lambda 函数分配给变量,然后通过该变量的名称调用它。