我有一个名为df_tag的数据帧。为了预处理数据,我在for循环中逐列遍历数据帧。在另一种情况下,我有一个String列,它首先将字符串转换为小写(#lower(,然后使用regex(#标点符号(应用lambda函数。问题是在for循环中,标点符号部分不起作用:
for col in df_tag.columns:
if df_tag[col].dtypes == "int64":
new_data[col]=df_tag[col]
else:
#lower
new_data[col] = df_tag[col].str.lower()
#punctuation
new_data[col] = df_tag[col].apply(lambda x : " ".join(re.findall('[w]+',x)))
但当我应用标点符号部分而不使用for循环时,效果很好。下面是一个例子,我将其应用于显式调用的列"名称":
new_data['Name'] = df_tag['Name'].apply(lambda x : " ".join(re.findall('[w]+',x)))
有人能给我一个用列循环的好方法吗。
在for循环解决方案中,您将用new_data[col]中的标点符号部分替换下部
将给你一个如何让你的代码工作的例子:
import pandas as pd
import re
data = {'Col1':list(range(1,5)),'Col2': list(range(6,10)),'Col3': ['a=b~c','B-C-D','c?d?e','D.E,F'] }
df_tag = pd.DataFrame(data, columns=data.keys())
print(df_tag)
# Col1 Col2 Col3
#0 1 6 a=b~c
#1 2 7 B-C-D
#2 3 8 c?d?e
#3 4 9 D.E,F
new_data = pd.DataFrame().reindex_like(df_tag)
for col in df_tag.columns:
if df_tag[col].dtypes == "int64":
new_data[col]=df_tag[col]
else:
#lower & punctuation
new_data[col] = df_tag[col].str.lower().apply(lambda x : " ".join(re.findall('[w]+',x)))
结果的打印将看起来像这个
print(new_data)
# Col1 Col2 Col3
#0 1 6 a b c
#1 2 7 b c d
#2 3 8 c d e
#3 4 9 d e f