修改数据类型
在Pandas中,DataFrame是一个二维标签化数据结构,可以保存不同类型的数据。在进行数据分析和处理时,经常需要修改DataFrame中列的数据类型,以适应后续的数据处理操作。比如,当你需要对数据进行数学上的操作时,如果发现数据类型不正确,比如最大值或最小值出现异常,那么你就需要修改数据类型。
以下是一些修改DataFrame中列数据类型的方法:
- 使用
astype()
方法:
astype()
方法可以用于转换指定列的数据类型。这个方法不会就地修改原始的DataFrame,而是返回一个类型转换后的新DataFrame。如果你希望将原始DataFrame中的更改反映出来,就需要将返回的新DataFrame重新赋值给原始的DataFrame或相应的变量。
例如,将名为df
的DataFrame中的'grade'
列从浮点型转换为整型,可以使用以下代码:df['grade'] = df['grade'].astype(int)
- 使用
to_numeric()
方法:
to_numeric()
方法用于将参数转换为numpy数值类型。这个方法可以处理一些特殊的转换,例如,将字符串转换为数值类型,并且可以选择性地忽略无法转换的值。
例如,将df
中的'temparray1'
转换为整型,'temparray2'
转换为浮点型,可以使用:df['temparray1'] = pd.to_numeric(df['temparray1'], downcast='integer') df['temparray2'] = pd.to_numeric(df['temparray2'], downcast='float')
- 在创建DataFrame时指定数据类型:
当你使用Pandas的DataFrame
构造函数创建一个新的DataFrame时,可以直接指定每列的数据类型。
例如:df = pd.DataFrame({ 'col1': [1, 2, 3], 'col2': [1.111, 2.222, 3.333] }, dtype={'col1': int, 'col2': float})
- 使用
rename()
方法修改列名:
如果你需要修改列名,以便反映其新的数据类型,可以使用rename()
方法。
例如:df.rename(columns={'old_name': 'new_name'}, inplace=True)
- 使用
dtypes
属性检查数据类型:
你可以使用df.dtypes
来检查DataFrame中每列的数据类型,以确认是否需要进行修改。
数据类型转换是数据预处理的一个基础步骤,确保了数据的一致性和准确性,为后续的数据分析打下良好的基础。
格式化字符串
示例:
pivot_df['Month_Period'] = pivot_df.index.map(lambda x: f'Month_{x}')
在Python中,lambda
是一个关键字,用于创建匿名函数。匿名函数是一种没有名称的函数,通常用于简短的、一次性的任务。lambda
函数的基本语法是:
lambda arguments: expression
其中,arguments
是传递给lambda
函数的参数列表,expression
是一个关于这些参数的表达式,它会在函数被调用时执行,并返回其结果。
在您提供的代码中,lambda x: f'Month_{x}'
是一个lambda
函数,它接受一个参数x
,并返回一个格式化的字符串'Month_'
加上x
的值。这里的x
代表月份,例如1
对应'Month_1'
,2
对应'Month_2'
,依此类推。
函数map()
是一个内置函数,它接受一个函数和一个可迭代对象,然后返回一个迭代器,其中包含将该函数应用于可迭代对象的每个元素的结果。在您的代码中,map()
函数将lambda
函数应用于pivot_df.index
,这是一个包含月份的索引的序列。
这里是如何工作的:
pivot_df.index
包含了月份的索引,例如1
,2
,3
, …,12
。map(lambda x: f'Month_{x}')
将lambda
函数应用于每个索引,将它们转换为'Month_1'
,'Month_2'
,'Month_3'
, …,'Month_12'
这样的字符串。- 这些字符串然后被用作
pivot_df
的新列'Month_Period'
的值。
总结来说,lambda x: f'Month_{x}'
是一个匿名函数,用于将月份的数字转换为具有格式化的字符串形式,以便在数据透视表中作为列名使用。
合并循环
示例
all_months_capacity = pd.concat([pd.read_excel(f'Capacity_{i}.xlsx') for i in range(1, 13)])
将字典的值或键生产列表
# 假设我们有一个字典
my_dict = {'a': 1, 'b': 2, 'c': 3}
# 使用list()函数将字典的值或列转换为列表
values_list = list(my_dict.values())
keys_list = list(my_dict.keys())
# 输出结果
print(values_list)
多条件包含
问题:dataframe 数据中姓名字段 含 张 或李的 输出为是,否则为否
import pandas as pd
# 创建一个示例DataFrame
data = {'姓名': ['张三', '李四', '王五']}
df = pd.DataFrame(data)
# 使用str.contains()方法检查姓名字段是否包含“张”或“李”
df['是否含有张或李'] = df['姓名'].str.contains('张|李').astype('int').replace({0: '否', 1: '是'})
print(df)
用正则表达式匹配出括号外的字符
问题:dataframe数据 有一列数值是西三(新车p),忘我我o(dadad) 格式 用正则表达式匹配出括号外的数据
import pandas as pd
import re
# 假设这是您的DataFrame
data = {'data': ['西三(新车P)', '我我(dadad)', '括号外的数据(不需要提取)']}
df = pd.DataFrame(data)
# 定义一个正则表达式,匹配括号内的内容
pattern = r'\(.*\)'
# 使用str.extract方法提取括号内的内容,但不包括括号本身
# 这里我们使用正则表达式的分组功能,并且指定分组为0,即括号外的内容
df['extracted'] = df['data'].str.extract(pattern, expand=False)[0]
# 只输出原始的DataFrame
print(df['data'])
dataframe 将姓名中不为空的值生成列表
import pandas as pd
# 假设df是你的DataFrame,且有一个名为'name'的列表示姓名
df = pd.DataFrame({
'name': ['Alice', 'Bob', None, 'Charlie', '']
})
# 过滤出姓名不为空的值(两种写法)
non_empty_names = df.loc[df['name'].notna(), 'name']
non_empty_names = df[df['name'].notna()]['name']
# 将结果转换为列表
name_list = non_empty_names.tolist()
print(name_list)
在这个例子中,我们首先使用df[‘name’].notna()来创建一个布尔系列,其中姓名不为空的条目为True。然后,我们使用df.loc根据这个布尔系列来过滤出不为空的姓名。最后,我们使用tolist方法将这些姓名转换成一个Python列表。
注意,这个方法会排除所有的空值(None)和空字符串。如果你只想排除None而不想排除空字符串,你可以使用df[‘name’].notnull()代替df[‘name’].notna()。
条件删除
问题:如果姓名出现两次,则删除入职日期小的一行
在Python的pandas库中,你可以使用DataFrame的drop_duplicates
方法来删除重复的行。如果你想要在删除重复行时根据姓名和入职日期进行排序,并保留入职日期较大的一行,可以使用参数subset
和keep
。下面是一个如何实现的例子:
import pandas as pd
# 假设df是你的DataFrame,且包含'姓名'和'入职日期'两列
# 首先根据姓名排序,然后保留入职日期较大的行
df = df.sort_values(by=['姓名', '入职日期'], ascending=[True, False])
# 删除除了第一条记录以外的重复记录
df = df.drop_duplicates(subset='姓名', keep='first')
# 现在df中就不会有姓名重复且入职日期更小的行了
这段代码首先根据’姓名’和’入职日期’进行升序排序(姓名不变,入职日期降序),这样相同姓名的情况下,入职日期较晚的行会排在前面。然后使用drop_duplicates
方法并设置subset='姓名'
和keep='first'
,这样就可以删除每个姓名对应的第一条记录以外的所有重复记录,保留入职日期较大的那一行。
replace替换字典
A数据Dataframe,姓名和成绩还有其他字段,B数据Dataframe,姓名和成绩,将A表中的成绩替换为B表中对应的成绩。
下面是一个具体的例子,展示了如何使用Pandas的replace
方法来替换DataFrame A中的成绩,使其与DataFrame B中的成绩一致:
import pandas as pd
# 创建示例数据
dataA = {
'姓名': ['张三', '李四', '王五', '赵六'],
'成绩': [80, 90, 70, 85]
}
dataB = {
'姓名': ['张三', '李四', '赵六'],
'成绩': [85, 95, 90]
}
# 创建DataFrame A和DataFrame B
A = pd.DataFrame(dataA)
B = pd.DataFrame(dataB)
# 使用replace方法替换A表中的成绩
# 这里我们假设B表中的成绩是正确的,所以用B表中的成绩替换A表中的成绩
A['成绩'] = A['姓名'].map(B['成绩'].to_dict())
# 打印结果
print(A)
在这个例子中,我们首先创建了两个DataFrame A和B,它们包含了姓名和成绩。然后,我们使用map
方法结合to_dict
将DataFrame B中的成绩转换为一个字典,然后将这个字典映射到DataFrame A中的"姓名"列,从而替换掉A中的成绩。
输出结果将会是:
姓名 成绩
0 张三 85
1 李四 95
2 王五 70
3 赵六 90
请注意,这个例子假设DataFrame B中的成绩是正确的,并且DataFrame A和B中的姓名是匹配的。如果DataFrame B中的成绩是错误的,或者A和B中的姓名不完全匹配,那么替换操作可能会导致不正确的结果。在这种情况下,你可能需要先对数据进行清洗和匹配处理。