
在数据清洗和预处理中,我们经常需要对dataframe的字符串列进行操作,例如拆分、替换或拼接。然而,当这些操作需要基于特定条件(例如,只有当字符串包含某个子串时才执行)时,直接使用pandas的.str访问器可能无法满足需求,因为它通常会无差别地应用于所有行。本教程将展示如何优雅地解决这一问题。
假设我们有一个包含地址信息的DataFrame,其中address列可能包含“floor”(楼层)信息。我们的目标是:
原始数据示例:
address 0 xxx City yyy road 17 number 8 floor west bank 1 ttt City iii road 1 number 2 ggg City kkk road 25 number 1 floor apple store
期望结果:
address 0 xxx City yyy road 17 number 8 floor 1 ttt City iii road 1 number 2 ggg City kkk road 25 number 1 floor
许多初学者可能会尝试使用如下代码:
立即学习“Python免费学习笔记(深入)”;
import pandas as pd
data = {
'address': [
'xxx City yyy road 17 number 8 floor west bank',
'ttt City iii road 1 number',
'ggg City kkk road 25 number 1 floor apple store'
]
}
df = pd.DataFrame(data)
# 错误的尝试:无条件拆分和拼接
df['address_attempt'] = df['address'].str.split('floor').str[0] + ' floor'
print("错误的尝试结果:")
print(df[['address', 'address_attempt']])输出结果:
错误的尝试结果:
address address_attempt
0 xxx City yyy road 17 number 8 floor west bank xxx City yyy road 17 number 8 floor
1 ttt City iii road 1 number ttt City iii road 1 number floor
2 ggg City kkk road 25 number 1 floor apple store ggg City kkk road 25 number 1 floor分析: 上述代码的问题在于df['address'].str.split('floor').str[0]会应用于所有行。
解决此问题的关键是引入条件判断。我们可以定义一个自定义函数,该函数接收单个地址字符串作为输入,并在函数内部进行条件判断,然后使用DataFrame.apply()方法将其应用于DataFrame的整个列。
示例代码:
import pandas as pd
# 准备数据
data = {
'address': [
'xxx City yyy road 17 number 8 floor west bank',
'ttt City iii road 1 number',
'ggg City kkk road 25 number 1 floor apple store',
'aaa City bbb road 10' # 增加一个不含floor的例子
]
}
df = pd.DataFrame(data)
# 定义处理地址的函数
def process_address(address):
"""
根据地址是否包含 'floor' 进行条件性处理。
如果包含,则拆分、清理并重新拼接 ' floor';
否则,返回原始地址。
"""
if isinstance(address, str) and 'floor' in address:
# 拆分字符串,取第一部分,去除前后空格,然后拼接 ' floor'
return address.split('floor')[0].strip() + ' floor'
else:
# 如果不包含 'floor' 或不是字符串类型,则返回原始值
return address
# 应用函数到 'address' 列
df['processed_address'] = df['address'].apply(process_address)
print("最终处理结果:")
print(df[['address', 'processed_address']])输出结果:
最终处理结果:
address processed_address
0 xxx City yyy road 17 number 8 floor west bank xxx City yyy road 17 number 8 floor
1 ttt City iii road 1 number ttt City iii road 1 number
2 ggg City kkk road 25 number 1 floor apple store ggg City kkk road 25 number 1 floor
3 aaa City bbb road 10 aaa City bbb road 10代码解析:
process_address(address) 函数:
df['address'].apply(process_address):
通过结合自定义函数和DataFrame.apply()方法,我们可以实现Pandas DataFrame列中复杂且条件性的字符串操作。这种方法提供了高度的灵活性和精确性,确保数据转换能够严格按照业务逻辑进行,避免了不必要的修改,是数据清洗和预处理中非常实用的技巧。在处理字符串数据时,始终考虑潜在的空值、类型不匹配和性能需求,以构建健壮的数据处理流程。
以上就是Python Pandas:DataFrame 列的条件性字符串拆分与拼接技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号