【问题标题】:Combining lists by category and creating new column with description for each list按类别组合列表并为每个列表创建带有描述的新列
【发布时间】:2020-02-13 08:49:29
【问题描述】:

我有 15 个 .txt 列表,我想按类别将它们组合起来,并将每个列表的描述单独保存在一个新列中。不幸的是,并非所有类别都出现在每个列表中,并且描述需要与正确的类别相对应。

例如,如果我的两个列表看起来像:

List 1:
1   a
4   b
5   c
2   d



List 2:
3   a
6   c
7   f
2   g

我正在寻找一个输出,例如(但最终要合并 15 个文件):

category List1 List2    
a   1   3
b   4   
c   5   6 
d   2   
f       7
g       2

是否有人提供脚本建议来帮助实现这一目标? 谢谢!

【问题讨论】:

    标签: python list perl scripting command


    【解决方案1】:

    PYTHON 解决方案:

    我想你的文件以这种方式包含数据:

    1   a
    4   b
    5   c
    2   d
    

    这是我的示例代码,我将解释发生了什么。

    files = ['test1.txt', 'test2.txt']
    category_dict = dict()
    for _file in files:
        with open(_file, 'r') as fhl:
            for line in fhl:
                key, val = line.split()
                if key in category_dict:
                    category_dict[key].append(val)
                else:
                    category_dict[key] = [val]
    print(category_dict)
    

    打印结果:

    {'1': ['a'], '4': ['b'], '5': ['c'], '2': ['d', 'g'], '3': ['a'], '6': ['c'], '7': ['f']}
    

    首先,我创建一个简单的列表,列出我想要阅读的所有文件。请注意,您可以通过 os.walk(在线查看)从目录中获取所需的所有文件,或者您可以简单地在此列表中添加失败(完整 pat)。

    files = ['test1.txt', 'test2.txt']
    

    然后我们创建一个字典对象以您想要的方式存储我们的数据:

    category_dict = dict()
    

    然后我们遍历文件列表并打开每个文件并逐行读取:

    for _file in files:
        with open(_file, 'r') as fhl:
            for line in fhl:
    

    这是有趣的部分。如果文件与您上面显示的格式不完全一致,您可能会得到错误或以您想要的方式读取数据。检查您的文件并根据需要调整“split()”部分。

    另外,我们拆分(网上查),基本上是把一个字符串拆分成单词列表。

    key, val = line.split()
    

    请注意,如果它们没有用空格分隔,您可能需要调整上面的行。

    之后我们检查'key'是否出现在'category_dict'中,如果没有,我们创建它,然后使它等于我们从文件中获得的值的列表。如果键已经存在,这意味着我们已经为该“键”分配了一个值列表。然后我们只需附加新值。

    这样您将拥有一个“类别”并分别保留每个“键”值。

    编辑: 如果要将结果记录在一个文件(txt 扩展名)中,则 dict 中的每个值都要写在一个新行上,示例如下:

    with open('results.txt', 'w+') as fhl:
        for key in category_dict:
            fhl.write('{} {}'.format(key, ' '.join(category_dict[key])))
            fhl.write('\n')
    

    结果:

    1 a
    4 b
    5 c
    2 d g
    3 a
    6 c
    7 f
    

    【讨论】:

    • 非常感谢您的帮助!这似乎可以很好地读取我的文件。唯一的事情是我想将输出打印到一个新的 txt 文件中,该文件将每个列表的结果保存在一个新列中。类别 List 1 List 2 a 1 3 b 4 c 5 6 d 2 f 7 g 2 (哎呀,我不知道如何在这里格式化输出,所以编辑了原始帖子以显示我希望的输出格式类型能够进入最终文件。)谢谢!
    • 我编辑了我的原始帖子以包括以您想要的格式写入文件。
    • 这越来越近了!唯一的事情是我需要确保每个文件都保留在自己的列中。例如,如果文件 1 和 2 都有关于“a”的信息,那么第一行将是“a 1 3”。但是,如果只有文件 2 包含“g”的信息,那么文档中的行将是“g 2”,在 g 和 2 之间有一个额外的空格,表示它属于第二个文件。抱歉,这有点令人困惑。我已经尝试在上面的示例输出中显示这一点,用标签分隔列。或者,如果这样更容易,这些可以打印为 csv?
    【解决方案2】:
    import glob
    import pandas as pd
    files = glob.glob('*.txt')
    #eg: files = ['1.txt','2.txt']
    result = pd.DataFrame()
    for file in files:
        df = pd.read_csv(file,delimiter='  ')
        current_col = df.columns[0]
        df.reset_index(inplace=True)
        df.set_index(current_col,inplace=True)
        df.index.name = 'index'
        df.rename(columns={'index':current_col}, inplace=True)
        result = pd.concat([result,df],axis=1)
    
    >>> result
        List 1:  List 2:
     a      1.0      3.0
     b      4.0      NaN
     c      5.0      6.0
     d      2.0      NaN
     f      NaN      7.0
     g      NaN      2.0
    
    >>> result.fillna(0)
        List 1:  List 2:
     a      1.0      3.0
     b      4.0      0.0
     c      5.0      6.0
     d      2.0      0.0
     f      0.0      7.0
     g      0.0      2.0
    

    【讨论】:

    • 谢谢!这看起来会很好用。但是,我收到一个错误:文件“count.py”,第 3 行,在 result=pd.DataFrame() NameError: name 'pd' is not defined”。我认为这可能是我的 python 中的错误版本,但我尝试运行 v3 和 v2 都没有运气。
    • 我的错,请导入 pandas 作为 pd
    • 啊!是的,我感谢您的帮助!但现在的错误是: ParserWarning: Falling backing to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' 被解释为 regex);你可以通过指定engine='python'来避免这个警告。 df = pd.read_csv(file,delimiter=' ') create_count_file4.py:14: FutureWarning: 排序,因为非连接轴未对齐。未来版本的 pandas 将默认更改为不排序。要接受未来的行为,请传递 'sort=False'...
    • ... ParserWarning:回退到“python”引擎,因为“c”引擎不支持正则表达式分隔符对不起,我对 Python 不太熟悉。
    • 抱歉耽搁了。并再次感谢您的帮助!我可以通过重新安装 python 来纠正我的错误,但我想知道您是否可以帮助我将结果打印到一个新的 txt 文件中?谢谢!
    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多