【问题标题】:Aggregate values of same name pandas dataframe columns to single column将同名熊猫数据框列的值聚合到单列
【发布时间】:2019-03-12 22:47:32
【问题描述】:

我有多个通过标记代码生成的 csv 文件。这些文件包含大写和小写的关键字。我想将所有这些文件合并到一个数据框中,其中包含所有小写的唯一值(总和)。你会建议什么来得到下面的结果?

初始 DF:

+---+---+----+-----+
| a | b |  A |  B  |
+---+---+----+-----+
| 1 | 2 |  3 |   1 |
| 2 | 1 |  3 |   1 |
+---+---+----+-----+

结果

+---+---+
| a | b |
+---+---+
| 4 | 3 |
| 5 | 2 |
+---+---+

我无权访问创建 csv 文件的原始数据,因此我无法在前面的步骤中更正此问题。目前我已经尝试将 .lower() 映射到我创建的数据帧标题,但它返回具有相同名称的单独列,如下所示:

使用 pandas 不是必需的。我曾想过将 csv 文件转换为字典,然后尝试上述过程(结果比我想象的要复杂得多),或者使用列表。此外, group by 不会完成这项工作,因为它会删除不重复的列名。欢迎任何方法。

【问题讨论】:

    标签: python pandas dataframe tokenize


    【解决方案1】:

    代码:

    您可以遍历列,将具有相同小写表示的列相加:

    def sumDupeColumns(df):
        """Return dataframe with columns with the same lowercase spelling summed."""
    
        # Get list of unique lowercase column headers
        columns = set(map(str.lower, df.columns))
        # Create new (zero-initialised) dataframe for output
        df1 = pd.DataFrame(data=np.zeros((len(df), len(columns))), columns=columns)
    
        # Sum matching columns
        for col in df.columns:
            df1[col.lower()] += df[col]
    
        return df1
    

    示例:

    import pandas as pd
    import numpy as np
    
    np.random.seed(seed=42)
    
    # Generate DataFrame with random int input and 'duplicate' columns to sum
    df = pd.DataFrame(columns = ['a','A','b','B','Cc','cC','d','eEe','eeE','Eee'], 
                      data = np.random.randint(9, size=(5,10))
    
    df = sumDupeColumns(df)
    

    >>> print(df)
    
         d   eee   cc     a     b
    0  6.0  14.0  8.0   9.0  11.0
    1  7.0  10.0  5.0  14.0   7.0
    2  3.0  14.0  8.0   5.0   8.0
    3  3.0  17.0  7.0   8.0  12.0
    4  0.0  11.0  9.0   5.0   9.0
    

    【讨论】:

    • 感谢您的回复。它似乎正在工作,但行为相当奇怪。某些令牌被合并,而其他令牌则没有。例如,当我打印:df["zipentry"] 和 df["zipinputstream"] 时,我得到:console print
    • @NikKrukt 你能提供输入吗? IE。原始数据框列的外观。我怀疑两个列标题都不是完全小写的(例如ZipentryZipEntry)。如果是这样,您将需要稍微复杂一点的逻辑来“配对”成对的列。
    • 就是这样!输入是从项目的不同版本生成的令牌,所以这种情况经常发生,就像你提到的那样以不同的组合。如何解决这个问题?
    • @NikKrukt 我已经更新了逻辑以处理具有不同大小写组合的任意数量的列。这对你有用吗?
    • 它似乎工作得很好!我喜欢你使用 set() 的方法。非常感谢您的时间和精力。
    【解决方案2】:

    以下解决方案应该这样做:

    import pandas as pd
    import numpy as np 
    
    np.random.seed(seed=1902)
    
    test_df = pd.DataFrame({
        # some ways to create random data
        'a': np.random.randint(9, size=5),
        'b': np.random.randint(9, size=5),
        'A': np.random.randint(9, size=5),
        'B': np.random.randint(9, size=5),
        'c': np.random.randint(9, size=5),
    })
    
    sum_df = test_df.copy()
    columns_to_keep = set([name.lower() for name in list(test_df)])
    
    for column_name in columns_to_keep:
        mutual_columns = [column_name, column_name.upper()]
        mutual_columns = [value for value in mutual_columns if value in list(test_df)]
        sum_df[column_name] = test_df[mutual_columns].sum(axis=1)
    
    sum_df = sum_df[list(columns_to_keep)]
    print("original is:\n", test_df)
    print("sum is:\n", sum_df)
    

    生产

    original is:
        a  b  A  B  c
    0  2  5  7  2  4
    1  1  6  2  3  1
    2  0  4  2  4  3
    3  6  5  5  7  4
    4  1  0  2  7  5
    
    sum is:
         a   b  c
    0   9   7  4
    1   3   9  1
    2   2   8  3
    3  11  12  4
    4   7  5   3
    

    基本上列出要求和的相互列(分别由列的名称及其相应的上或下给出),并仅在对应的行中求和。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-13
      • 2017-09-26
      • 2017-09-29
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多