我正在寻找 pandas df 中混合列中字母的数量。如果字母数量超过 2,请保留最接近数字的两个字母。
我尝试使用下面的方法获取计数
df['count'] = len(re.findall('[a-zA-Z]', a['MyCOlumn']))
但出现以下错误:
TypeError: Expected string or bytes-像对象
输入
ABAB5395
DC5395
ABCD1234
输出
AB5395
DC5395
CD1234
以下是使用 Python 和 Pandas 解决问题的分步方法:
import pandas as pd
import re
def keep_closest_letters(text):
"""如果超过 2 个字母,则保留最接近数字的 2 个字母。"""
letters = re.findall(r'[a-zA-Z]+', text)
if len(letters) > 2:
numbers = re.findall(r'\d+', text)
if numbers:
closest_letter_index = min(enumerate(letters), key=lambda x: abs(text.index(x[1]) - text.index(numbers[0])))[0]
if closest_letter_index > 0:
letters = letters[closest_letter_index-1:closest_letter_index+1]
else:
letters = letters[:2]
else:
letters = letters[:2]
return ''.join(letters)
# 示例 DataFrame
df = pd.DataFrame({'MyColumn': ['ABAB5395', 'DC5395', 'ABCD1234']})
# 应用该函数来创建新的“输出”列
df['Output'] = df['MyColumn'].apply(keep_closest_letters)
print(df)
这将打印:
MyColumn Output
0 ABAB5395 AB5395
1 DC5395 DC5395
2 ABCD1234 CD1234
说明:
-
导入必要的库:
我们需要
pandas
来进行 DataFrame 操作,re
用于正则表达式。 -
定义一个函数
keep_closest_letters(text)
: - 此函数接受文本字符串作为输入。
-
它使用
re.findall
查找所有字母序列 ([a-zA-Z]+
) 和数字 (\d+
)。 - 如果字母超过 2 个,它会找到最接近第一个数字的字母,并保留该字母及其前一个或后一个字母(如果有)(最多保留 2 个字母)。
- 它返回连接的字母字符串。
-
创建示例 DataFrame:
我们创建一个示例 DataFrame
df
,其中包含你的数据。 -
应用该函数来创建一个新的“输出”列:
我们使用
.apply
方法将keep_closest_letters
函数应用于MyColumn
中的每一行,并将结果存储在一个新的Output
列中。
现在,你将拥有一个名为
Output
的新列,其中包含所需的转换后的字符串。