阅读df,拆分每个单元格并追加到列表中

时间:2019-12-10 11:01:42

标签: python-3.x pandas loops csv

我正在处理具有多列的csv文件。 该文件看起来像这样...

A,B,C
1,'x;y;z','e;f;g'
2,'w;x;y','r;s;t'
3,'','p;q;r'

文件中的每个单元格都有一个以“;”分隔的字符串。

我想通过读取每个单元格并根据分隔符拆分每个单元格来创建一个列表。

我已经可以执行此操作,但是存在性能问题。

csv文件很大,因此我正在寻找优化的版本。

列名是预先已知的。我的代码在下面给出

我当前的解决方案是 列出每个列的所有行 整理清单 如果项目是字符串,则拆分列表中的项目,并追加到新列表 从列表中删除重复项

import pandas as pd

from io import StringIO
from collections import Iterable
import operator


csv_path ='my_dir'
# load the data with pd.read_csv
dataDF = pd.read_csv(csv_path)
dataDF.fillna(" ")
result=[]
cols=['A','B','C']

for i in cols:
    result.append(dataDF[i].tolist())

result=reduce(operator.concat, result)
print(result)
my_list=[]
for token in result:
    if isinstance(token, str):
        my_list.append(token.split(";"))

my_list=reduce(operator.concat, my_list)
my_list=list(set(my_list))

2 个答案:

答案 0 :(得分:1)

如果您有很多重复的值,则可能会更快。

from itertools import chain

# load the data with pd.read_csv
dataDF = pd.DataFrame({'A': [1, 2, 3], 'B': ['x;y;z', 'w;x;y', ''], 'C': ['e;f;g', 'r;s;t', 'p;q;r']})
dataDF.fillna(" ", inplace=True)
results_set = set()
for i in dataDF.columns:
    try:
        results_set.update(chain(*dataDF[i].str.split(';').values))
    except AttributeError:
        pass
print(results_set)

答案 1 :(得分:0)

尝试这个:

from itertools import chain

# load the data with pd.read_csv
dataDF = pd.DataFrame({'A': [1, 2, 3], 'B': ['x;y;z', 'w;x;y', ''], 'C': ['e;f;g', 'r;s;t', 'p;q;r']})
dataDF.fillna(" ", inplace=True)
list_of_lists = []
for i in dataDF.columns:
    try:
        list_of_lists.extend(dataDF[i].str.split(';').values)
    except AttributeError:
        pass
print(set(chain(*list_of_lists)))