Pandas словарь обратного приращения данных в новом столбце - PullRequest
2 голосов
/ 18 февраля 2020

Я сохранил словарь с разными ключами в каждой строке и всеми значениями, равными 0, в новом столбце Dataframe.

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

Инкремент - это нормально, но сохранение представления не работает. В конце у меня один и тот же словарь во всем столбце.

Before
col1    col_dict
1       {1:0, 2:0, 3:0}
2       {1:0, 2:0, 3:0}
3       {1:0, 2:0, 3:0}

What i want:

col1    col_dict
1       {1:1, 2:1, 3:1}
2       {1:0, 2:1, 3:1}
3       {1:0, 2:0, 3:1}

What I have:

col1    col_dict
1       {1:1, 2:1, 3:1}
2       {1:1, 2:1, 3:1}
3       {1:1, 2:1, 3:1}

Например:

def function():
    for x in reversed(range(20)):
        #taking the value in the other column, and incrementing the value in the dictionary
        dataset["dict_column"][x][str(dataset.value[x])][0] += 1

Я попытался перейти к формату списка, та же проблема. Я думаю, что это связано с процессом pandas.

Заранее спасибо.

Открыт для любого решения, чтобы сделать работу

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете использовать копию словаря для присвоения col_dict после увеличения словаря. Переиндексация кадра данных для обеспечения обратного приращения.

import pandas as pd
import copy
df = pd.DataFrame()
df["col1"] = [1, 2, 3]

col_dict = {i:0 for i in df["col1"]}

def get_dict(col):
    col_dict[col] = 1
    return copy.copy(col_dict)

df = df.iloc[::-1]
df["col_dict"] = df["col1"].apply(get_dict)
df = df.iloc[::-1]
print(df)
0 голосов
/ 18 февраля 2020

Благодаря Джону Доу я нашел решение своей проблемы, возможно, это не лучший вариант, но, поскольку мне не нужны рабочие характеристики ..

Вот мой код, менее эффективный, чем его, я думаю , но для новичка, как я, может быть более понятным (без обид).

import pandas as pd
import copy

def function():
    #to skip the copy for the first (last) row
    flag = 0
    for x in reversed(range(20)):
        if flag == 0:
            dataset["dict_column"][x][str(dataset.value[x])][0] += 1
            flag = 1
        else:
            dataset["dict_column"][x] = copy.deepcopy(dataset["dict_column"][x+1])
            dataset["dict_column"][x][str(dataset.value[x])][0] += 1

...