Py3熊猫read_csv将项目插入字典

时间:2019-04-02 15:04:19

标签: python pandas

我正在尝试做一些简单的事情,但是不知道如何从数据框中读取实际的行。我想在每个字符串上运行一些正则表达式。

.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'

因此,似乎内容是元组,因此只需要弄清楚如何从中获取字符串即可。

3 个答案:

答案 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()
    }