【问题标题】:How to read text file's key, value pair using pandas?如何使用熊猫读取文本文件键、值对?
【发布时间】:2016-07-14 05:57:10
【问题描述】:

我想解析一个包含以下数据的文本文件。

Input.txt-

1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d

在此输入文本文件中,没有固定列,它可能是 10 或 20 或任何值。我想用熊猫解析这个文件。输出应包含:

output.txt-

index[0]
1     88
11    1438
15    kkk
45    7.7
45    00
21    66
86    a

index[1]
4     13
4     1388
49    DDD
8     157.73
67    00
45    08
84    b
45    k

关于如何获得此类结果的任何建议?

【问题讨论】:

    标签: python pandas dataframe key


    【解决方案1】:

    您可以先read_csv 使用不在数据中的分隔符,例如;,然后将splitstack 加倍:

    import pandas as pd
    import numpy as np
    import io
    
    temp=u"""1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
    4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
    6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
    """
    #after testing replace io.StringIO(temp) to filename
    df = pd.read_csv(io.StringIO(temp), sep=";", index_col=None, names=['text'])
    
    print (df)
                                                    text
    0        1=88|11=1438|15=KKK|45=7.7|45=00|21=66|86=a
    1  4=13|4=1388|49=DDD|8=157.73|67=00|45=08|84=b|45=k
    2           6=84|41=18|56=TTT|67=1.2|4=21|45=78|07=d
    
    s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
    print (s)
          0       1
    0 0   1      88
      1  11    1438
      2  15     KKK
      3  45     7.7
      4  45      00
      5  21      66
      6  86       a
    1 0   4      13
      1   4    1388
      2  49     DDD
      3   8  157.73
      4  67      00
      5  45      08
      6  84       b
      7  45       k
    2 0   6      84
      1  41      18
      2  56     TTT
      3  67     1.2
      4   4      21
      5  45      78
      6  07       d
    
    dfs = [g.set_index(0).rename_axis(None) for i, g in s.groupby(level=0)]
    print (dfs[0])
           1
    1     88
    11  1438
    15   KKK
    45   7.7
    45    00
    21    66
    86     a
    
    for i, g in s.groupby(level=0):
        print (g.set_index(0).rename_axis(None))
           1
    1     88
    11  1438
    15   KKK
    45   7.7
    45    00
    21    66
    86     a
             1
    4       13
    4     1388
    49     DDD
    8   157.73
    67      00
    45      08
    84       b
    45       k
          1
    6    84
    41   18
    56  TTT
    67  1.2
    4    21
    45   78
    07    d
    

    通过评论编辑:

    如果需要写入文件s,请使用to_csv

    s.to_csv('file.txt', header=None, index=None, sep='\t')  
    

    通过评论编辑1:

    您可以将列名设置为空字符串并通过rename_axis 删除索引名称(pandas 0.18.0 中的新功能),但更常见的是将列名设置为某些文本(例如s.columns = ['idx','a']):

    s = df.text.str.split('|', expand=True).stack().str.split('=', expand=True)
    s.columns = ['idx','']
    print (s)
        idx        
    0 0   1      88
      1  11    1438
      2  15     KKK
      3  45     7.7
      4  45      00
      5  21      66
      6  86       a
    1 0   4      13
      1   4    1388
      2  49     DDD
      3   8  157.73
      4  67      00
      5  45      08
      6  84       b
      7  45       k
    2 0   6      84
      1  41      18
      2  56     TTT
      3  67     1.2
      4   4      21
      5  45      78
      6  07       d
    dfs = [g.set_index('idx').rename_axis(None) for i, g in s.groupby(level=0)]
    print (dfs[0])
    1     88
    11  1438
    15   KKK
    45   7.7
    45    00
    21    66
    86     a
    

    【讨论】:

    • 该死!你又打败了我 ;-) +1
    • @jezrael- 一切都很好,但我不希望在输出上方打印这个 1 和 0。我们可以为此做些什么?编辑答案并提供一些顶级解释。
    • @kit 你应该自己做所以不是代码编写服务。
    • @shivsn- 我不是在询问代码或答案。我正在征求建议。
    • @kit - 您是否需要写入文件 s - 只有列 01 没有标题和索引?然后使用s.to_csv('file.txt', header=None, index=None, sep='\t')
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2019-03-31
    相关资源
    最近更新 更多