Как суммировать второе значение во фрейме данных, который состоит из кортежей, и использовать выходные данные для создания нового столбца во фрейме данных - PullRequest
0 голосов
/ 02 июля 2019

У меня есть фрейм данных с 6 столбцами и 3 строками. Фрейм данных состоит из кортежей, например, (3, 5)(4, 5)(3, 5)(5, 5)(2, 3)(5, 3).

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

Вот так выглядит мой фрейм данных

1 Ответ

0 голосов
/ 02 июля 2019

Если вы просто хотите отфильтровать определенные значения для первого элемента. Вы можете сделать это так:

import pandas as pd

df= pd.DataFrame({
        'tuple1': [(3,1), (4,3), (2,2), (3,1)], 
        'tuple2': [(4,1), (1,1), (2,1), (5,2)],
        'tuple3': [(1,2), (2,3), (3,4), (2,5)],
        'tuple4': [(3,4), (1,3), (2,2), (3,1)],
        'tuple5': [(4,2), (1,2), (3,1), (5,4)],
        })

def sum_tuples(df, tup_columns, sum_column, filter_value):
    df[sum_column]= 0
    for col in tup_columns:
        df[sum_column]+= df[col].map(lambda t: t[1] if t[0] == filter_value else 0)

sum_tuples(df, ['tuple1', 'tuple2', 'tuple3', 'tuple4', 'tuple5'], 'sum_threes', 3)

Он проверяет все кортежи в столбцах, переданных в виде списка (tuple1, ...), и суммирует все 2-ые компоненты с определенным значением (в примере 3) и сохраняет результат в указанном столбце результатов кадра (sum_threes в примере). Результат 5, 0, 5, 2.

Если вместо этого вы хотите суммировать все кортежи по их первому значению, не вызывая функцию несколько раз, вы можете сделать это следующим образом:

# define a function that handles the tuples of a row
# and outputs the sum for all tuples whose first component 
# occured more than once
def agg_tuples(tuples):
    d= dict()
    multiple= set()
    for k, v in tuples:
        if k in d:
            # the first component already occured before
            # for this row --> memorize this in multiple
            d[k]+= v
            multiple.add(k)
        else:
            # value k occured the first time
            d[k]= v
    # now only return the sums of the tuples that occured multiple times
    return [(k, d[k]) for k in multiple]

# prepare an auxillary series with all tuple columns in one list
lists= df.apply(lambda r: agg_tuples([r[col] for col in ['tuple1', 'tuple2', 'tuple3', 'tuple4', 'tuple5']]), axis='columns')

# the following line would be the number of colums we 
# need at least to store all the result tuples
mx= max(lists.map(len))
# now we just need to split the list into seperate columns
# therefore we define three columns
result_cols= ['res1', 'res2', 'res3']
for idx, col in enumerate(result_cols):
    df[col]= lists.map(lambda l: l[idx] if idx<len(l) else None)
...