串联多个数据框

时间:2018-10-20 21:18:02

标签: python python-3.x pandas list dataframe

我正在对给定的一组嵌套列表执行一些字符串操作,而我只想在将这些列表连接到单个数据帧中之后创建单个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文件输出?

2 个答案:

答案 0 :(得分:1)

考虑将代码重构以便于组织和可读性,看来您需要进行两个pd.concat调用:在新行级别和文本文件级别。

具体来说,请考虑以下因素:

  1. def的任何循环之外放置return调用。无需迭代地重新定义相同的函数。

  2. 在读取文件时使用上下文管理器with,以避免处理后需要关闭。

  3. 让循环调用您的函数以返回输出,然后在最后将它们串联起来。

调整后的代码:

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)

答案 1 :(得分:0)

您想要执行以下操作:

frames = list()

def join_words(n):
    for listy in n:
        res = list(........does things to the lists)
        df = pd.DataFrame(res)
        frames.append(df)
    df = pd.concat(frames)
    df.to_csv('temp.csv', header = False)

只需在循环时累积每个单独的帧,然后最后将它们串联起来即可。