首页 > 解决方案 > 将同名熊猫数据框列的值聚合到单列

问题描述

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

初始 DF:

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

结果

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

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

.lower() 合并后

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

标签: pythonpandasdataframetokenize

解决方案


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

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

基本上制作一个相互列的列表来求和(分别由列的名称及其相应的上限或下限给出),并沿着与这些行相对应的行求和。


推荐阅读