python-Dataframe的8种小示例

修改数据类型

在Pandas中,DataFrame是一个二维标签化数据结构,可以保存不同类型的数据。在进行数据分析和处理时,经常需要修改DataFrame中列的数据类型,以适应后续的数据处理操作。比如,当你需要对数据进行数学上的操作时,如果发现数据类型不正确,比如最大值或最小值出现异常,那么你就需要修改数据类型。
以下是一些修改DataFrame中列数据类型的方法:

  1. 使用astype()方法:
    astype()方法可以用于转换指定列的数据类型。这个方法不会就地修改原始的DataFrame,而是返回一个类型转换后的新DataFrame。如果你希望将原始DataFrame中的更改反映出来,就需要将返回的新DataFrame重新赋值给原始的DataFrame或相应的变量。
    例如,将名为df的DataFrame中的'grade'列从浮点型转换为整型,可以使用以下代码:
    df['grade'] = df['grade'].astype(int)
    
  2. 使用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')
    
  3. 在创建DataFrame时指定数据类型:
    当你使用Pandas的DataFrame构造函数创建一个新的DataFrame时,可以直接指定每列的数据类型。
    例如:
    df = pd.DataFrame({
        'col1': [1, 2, 3],
        'col2': [1.111, 2.222, 3.333]
    }, dtype={'col1': int, 'col2': float})
    
  4. 使用rename()方法修改列名:
    如果你需要修改列名,以便反映其新的数据类型,可以使用rename()方法。
    例如:
    df.rename(columns={'old_name': 'new_name'}, inplace=True)
    
  5. 使用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方法来删除重复的行。如果你想要在删除重复行时根据姓名和入职日期进行排序,并保留入职日期较大的一行,可以使用参数subsetkeep。下面是一个如何实现的例子:

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中的姓名不完全匹配,那么替换操作可能会导致不正确的结果。在这种情况下,你可能需要先对数据进行清洗和匹配处理。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值