Как преобразовать Dataframe в словарь - PullRequest
0 голосов
/ 26 марта 2020

У меня есть датафрейм, подобный указанному ниже.

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

{
(0, 'aan'): 1,
 (0, 'abcc'): 1,
 (1, 'acd'): 1,
 (3, 'access'): 5,
 (3, 'acd'): 3,
 (4, 'aao'): 2,
 (4, 'access’): 4
}

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Вы передаете его через разреженную матрицу и возвращаете DataFrame в качестве диктанта. К сожалению, pandas имеет ограниченные возможности разреженной матрицы, поэтому нам нужно использовать scipy. Следующий код должен работать для вашего приложения.

import scipy as sp
import pandas as pd
import numpy as np #for the random dataframe as example.

# Example dataframe
df = pd.DataFrame(np.random.randint(0,10,size=(1000, 10)))

# Use scipy to create sparse matrix
coo = sp.sparse.csc_matrix(df).tocoo(copy=False)

# Parse sparse matrix back into dataframe without zeroes.
df = pd.DataFrame({'index': coo.row, 'col': coo.col, 'data': coo.data})[
    ['index', 'col', 'data']].sort_values(['index', 'col']).reset_index(drop=True)

# Create index to split (row, column) from value.
ix = pd.MultiIndex.from_frame(df[['index','col']])
df = df['data'].copy(True)
df.index = ix

# Output as dict
df.to_dict()
df
   0  1  2  3  4  5  6  7  8  9
0  4  7  0  3  4  8  6  0  5  3
1  3  3  9  2  1  2  8  2  7  2
2  0  1  5  5  4  3  2  0  4  1
3  6  7  7  7  2  1  3  7  1  1
4  2  5  9  8  9  7  5  4  0  3
{(0, 0): 4,
 (0, 1): 7,
 (0, 3): 3, # Notice (0,2) is gone.
 (0, 4): 4,
 (0, 5): 8,
 (0, 6): 6,
 (0, 8): 5,
 (0, 9): 3,
 (1, 0): 3,
 (1, 1): 3,
 (1, 2): 9,
 (1, 3): 2,
 (1, 4): 1,
 (1, 5): 2,
 (1, 6): 8,
 (1, 7): 2,
 (1, 8): 7,
 (1, 9): 2,
 (2, 1): 1, # Notice (2,0) is gone.
 (2, 2): 5,
 (2, 3): 5,
 (2, 4): 4,
 (2, 5): 3,
 (2, 6): 2,
 (2, 8): 4,
 (2, 9): 1,
0 голосов
/ 26 марта 2020

Вот очень базовый c подход грубой силы. не масштабируется.

data = {'aan': [1, 2,0], 'aao': [0,3, 4], 'access':[0,0,1]}
df = pandas.pandas.DataFrame(data=data)
master= {}
for t in df.itertuples():
    _ = {(t.Index, col):getattr(t, col) for col in df.columns if getattr(t, col)}
    if not _:continue
    master.update(_)

Отпечатки

{(0, 'aan'): 1, (1, 'aan'): 2, (1, 'aao'): 3, (2, 'aao'): 4, (2, 'access'): 1}
0 голосов
/ 26 марта 2020

Возможно, есть два шага для решения проблемы:

  1. Получите логическое значение, будь то элемент 0
  2. Суммируйте значение
    result = (df==0).sum()
    result.to_dict() # convert data to dict
...