我正在尝试做一些简单的事情,但是不知道如何从数据框中读取实际的行。我想在每个字符串上运行一些正则表达式。
.csv文件没有标题,它只是一串充满一串字符串的列。
csv_data = pd.read_csv('list.csv', sep=',', header=None)
pattern = re.compile(r'(.*\/)(?!\/)(.*)', flags=re.DOTALL)
url_file = {
pattern.findall(row)[0]:
pattern.findall(row)[1]
for index, row in csv_data.iterrows()
}
但是我得到
TypeError:预期的字符串或类似字节的对象
编辑1
我不认为这是重复的,另一个建议的SO问题/解决方案是不同的上下文,并且具有标题和多列。
编辑2
print(csv_data.dtypes)
0 object
dtype: object
print(csv_data.head())
0 https://...
1 https://...
2 https://...
3 https://...
4 https://...
编辑3
这样做:
for row in csv_data.iterrows():
print(row.dtypes)
给出错误AttributeError: 'tuple' object has no attribute 'dtypes'
因此,似乎内容是元组,因此只需要弄清楚如何从中获取字符串即可。
答案 0 :(得分:1)
您可以在此单列上更好地使用lambda函数,并将regex操作保留在一个函数中,然后像这样调用: 假设数据是数据帧,字符串是列名:
data = pd.read_csv('list.csv', sep=',', header=None)
data.columns = ['string']
data['string'] = data['string'].apply(lambda x:regex_function(x))
答案 1 :(得分:1)
主要修改。您是对的:Yoshitha的解决方案并不理想,因为您特别希望该正则表达式中的两个元素匹配。
但是,Pandas确实有一个不错的正则表达式处理解决方案可以为您提供帮助。这样的东西很整洁:
matches = csv_data.iloc[:,0].str.extract(r'(.*\/)(?!\/)(.*)', expand=True)
然后获取您的字典表示形式,我们可以运行:
matches.set_index(0, drop=True).to_dict()[1]
如果输入中的url字符串与该正则表达式完全匹配,这可能仍然会出现问题。
简单的例子:
l = ['https://example.s3.amazonaws.com/uploads/full/68518-5df5b5e5t5b.jpg', 'test_with_bad_url']
matches = pd.DataFrame(l).iloc[:,0].str.extract(r'(.*\/)(?!\/)(.*)', expand=True)
your_dict = matches.set_index(0, drop=True).to_dict()[1]
print(your_dict)
{'https://example.s3.amazonaws.com/uploads/full/': '68518-5df5b5e5t5b.jpg',
nan: nan}
答案 2 :(得分:0)
或者您可以尝试以下代码:
csv_data = pd.read_csv('list.csv', sep=',', header=None, dtype=str)
csv_data = csv_data.fillna("")
pattern = re.compile(r'(.*\/)(?!\/)(.*)', flags=re.DOTALL)
url_file = {
pattern.findall(str(row))[0]:
pattern.findall(str(row))[1]
for index, row in csv_data.iterrows()
}