代码之家  ›  专栏  ›  技术社区  ›  MickD

将多行数据循环到数据帧中的一行[重复]

  •  1
  • MickD  · 技术社区  · 2 年前

    我正在从多行文本文件中提取数据点,并试图将组数据添加到数据帧中的一行,但我正在获取其自己行上的每个数据点。我想将其展平为2行group1和group2。我是蟒蛇新手。此外,如果有更有效的方法来做到这一点,那也将是伟大的。我试过了 groupby() 但这似乎不起作用?提前谢谢。

    import pandas as pd
    
    data = """
    Jan 2024
    Group1 02/02/2024
    dog 10 20
    cat 21 32
    Group2 05/02/2024
    dog 23 45
    cat 45 65
    owl 24 12
    monthly
    Admin 02 22
    clean 05 32
    """
    
    extract = []
    dog, cat, owl = [], [], []
    for line in data.splitlines():
        a = c = e = ''
        # print(line)
        if 'Group' in line:
            group = line.rsplit()[0]
        
        if 'dog' in line or 'cat' in line or 'owl' in line:
            if line.startswith("dog"):
                dog, a, b = line.split()
            elif line.startswith("cat"):
                cat, c, d = line.split()
            elif line.startswith("owl"):
                owl, e, f = line.split()
            
            extract.append({
                'group': group,
                'dog': a,
                'cat': c,
                'owl': e
            })
    
    df = pd.DataFrame(extract)
    df = df[['group', 'dog', 'cat', 'owl']]
    print(df)
    

    目前我得到以下信息:

        group dog cat owl
    0  Group1  10
    1  Group1      21
    2  Group2  23
    3  Group2      45
    4  Group2          24
    

    我想要的是:

       group dog cat owl
    0  Group1  10 21
    1  Group2  23 45  24 
    
    1 回复  |  直到 2 年前
        1
  •  0
  •   Maria K    2 年前

    可以在构造数据帧之前折叠行。这可以通过保持一个 dict column_name->value 每个组,当一个新组启动时刷新它,并将其添加为一行。别忘了在最后加一行。

    extract = []
    row = None
    
    for line in data.splitlines():
        if 'Group' in line:
            if row is not None: # we have something to add
                extract.append(row)
            group = line.rsplit()[0]
            row = {'group': group} # new group starts - refreshing our dict
        
        if 'dog' in line or 'cat' in line or 'owl' in line:
            animal, val1, val2 = line.split()
            row[animal] = val1
            
    if row is not None: # a final group
        extract.append(row)
    
    df = pd.DataFrame(extract)
    df = df[['group', 'dog', 'cat', 'owl']]
    print(df)
    

    输出

        group dog cat  owl
    0  Group1  10  21  NaN
    1  Group2  23  45   24