我正在对给定的一组嵌套列表执行一些字符串操作,而我只想在将这些列表连接到单个数据帧中之后创建单个csv。

我有一个像这样的功能:

path = os.path.join(os.getcwd(),'C:\\.........')
files = [os.path.join(path,i) for i in os.listdir(path) if os.path.isfile(os.path.join(path,i))]

for file in files:

    openfile = open(file,'r')
    new_line = []

    def separateState(l):
        for line in l:
            if any(x in line for x in ['NEW ENGLAND', 'MIDDLE ATLANTIC', 'E N CENTRAL', 'W N CENTRAL', 'SOUTH ATLANTIC', 'E S CENTRAL', 'W S CENTRAL', 'MOUNTAIN', 'PACIFIC']):
                new_line.append(line.split())

    separateState(openfile)

    frames = list()

    def join_words(n):
        for listy in n:
            grouper = groupby(listy, key=str.isalpha)
            joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
            res = list(chain.from_iterable(joins))
            df = pd.DataFrame(res)
            frames.append(df)
        df = pd.concat(frames)
        df['Date'] = os.path.split(file)[-1]
        df.to_csv('temp.csv', header = False)
        print(frames)

    join_words(new_line)


但这会为每个列表输出一个数据框,因为它会覆盖前一个数据框。

我该如何操作(我认为这是一个简单的解决方法),以便从此函数获得单个数据帧和CSV文件输出?

最佳答案

考虑重新组织代码以提高组织和可读性,并且似乎需要两个pd.concat调用:在新行级别和文本文件级别。

具体来说,请考虑以下事项:


使用defreturn调用置于任何循环之外。无需迭代地重新定义相同的函数。
读取文件时,请使用上下文管理器with以避免处理后关闭。
让循环调用您的函数以返回输出,然后在最后将它们串联起来。


调整后的代码:

def separateState(txt):
    new_line = []

    with open(txt, 'r') as l:
        for line in l:
            if any(x in line for x in ['NEW ENGLAND', 'MIDDLE ATLANTIC',
                                       'E N CENTRAL', 'W N CENTRAL',
                                       'SOUTH ATLANTIC', 'E S CENTRAL',
                                       'W S CENTRAL', 'MOUNTAIN', 'PACIFIC']):
                 new_line.append(line.split())

        return new_line

def join_words(n, txt):
    frames = list()

    for listy in n:
        grouper = groupby(listy, key=str.isalpha)
        joins = [[' '.join(v)] if alpha_flag else list(v) for alpha_flag, v in grouper]
        res = list(chain.from_iterable(joins))
        df = pd.DataFrame(res)
        df['Date'] = os.path.split(txt)[-1]
        frames.append(df)

    new_df = pd.concat(frames)
    return new_df


df_list = []
for file in files:
    new_line = separateState(file)
    df = join_words(new_line, file)
    df_list.append(df)

final_df = pd.concat(df_list)
final_df.to_csv('temp.csv', header = False)
print(df_list)

关于python - 串联多个数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52910194/

10-12 18:40