Объединить значения столбцов данных одного и того же имени pandas в один столбец - PullRequest
1 голос
/ 13 марта 2019

У меня есть несколько CSV-файлов, которые были созданы с помощью токенизации кода. Эти файлы содержат ключевые слова в верхнем и нижнем регистре. Я хотел бы объединить все эти файлы в одном кадре данных, который содержит все уникальные значения (сумма) в нижнем регистре. Что бы вы предложили, чтобы получить результат ниже?

Начальный DF:

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

Результат

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

У меня нет доступа к необработанным данным, из которых были созданы файлы CSV, поэтому я не могу исправить это на более раннем этапе. В настоящий момент я попытался сопоставить .lower () с заголовками данных, которые я создаю, но он возвращает отдельные столбцы с одинаковыми именами, например:

.lower() after merging

Использование панд не обязательно. Я думал о преобразовании файлов CSV в словари, а затем попробовать описанную выше процедуру (оказывается, это гораздо сложнее, чем я думал), или использовать списки. Кроме того, group by не выполняет эту работу, поскольку удаляет неповторяющиеся имена столбцов. Любой подход приветствуется.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Код:

Вы можете перебирать столбцы, суммируя те, которые имеют одинаковое строчное представление:

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
0 голосов
/ 13 марта 2019

Приведенное ниже решение должно выполнить:

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

, в основном составить список взаимных столбцов для суммирования (заданный именем столбца и его соответствующим верхним илиниже, соответственно) и сумма по строкам соответствует только этим.

...