Как преобразовать DataFrame в словарь, принимая только сопоставленные значения? - PullRequest
1 голос
/ 27 мая 2019

Мне нужно сбросить некоторые значения в DataFrame объектов

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'x': [[0] * 6, ['']],
    'y': [[0, np.nan, 0, 1, 0, 1], [4, 3, 5]],
    'z': [[5, 5, 5, 4, 4, 4], [65, 324, 45.345]]
})

def test(ar):
    if ar == ['']:
        return False
    else:
        return True

df.applymap(test)

applymap возвращает это:

df

Мне просто нужно взять столбцы и ячейки с True в структуру, подобную следующей:

d = {
    'x': [(0, [''])],
    'y': [(0, ['']), (1, ['']),]
    'z': [(0, ['']), (1, ['']),]
}

Какой самый быстрый метод для достижения этой цели? Должен быть простой способ ее решить.

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Я не уверен, насколько это эффективно, но вы можете попробовать:

new_df = df.applymap(test).stack()

# replace True with the empty string
new_df = new_df[new_df].replace({True:''}).reset_index(level=0)

# get the tuples
s = new_df.apply(lambda x: tuple(x), axis=1)

# group the tuples by (original) column names and return dict
d = s.groupby(s.index).apply(lambda x: x.tolist()).to_dict()

Выход:

{'x': [(0, '')], 'y': [(0, ''), (1, '')], 'z': [(0, ''), (1, '')]}

Оптимизированный алгоритм задает вопрос. Шаг замены не требуется, если я верну нужный объект в applymap напрямую

df = pd.DataFrame({
    'x': [[0] * 6, ['']],
    'y': [[0, np.nan, 0, 1, 0, 1], [4, 3, 5]],
    'q': [[''], ['']],
    'z': [[5, 5, 5, 4, 4, 4], [65, 324, 45.345]]
})
new_df = df.applymap(lambda x: None if x == [''] else [''])
new_df = new_df.stack().reset_index(level=0)
s = new_df.apply(lambda x: tuple(x), axis=1)
d = s.groupby(s.index).apply(lambda x: x.tolist()).to_dict()
d
1 голос
/ 27 мая 2019

Вероятно, есть более разумный способ сделать это, но он выполняет свою работу:

>>> df = pd.DataFrame({'x': [True, False], 'y': [True, True], 'z': [True, True]})
>>> df
       x     y     z
0   True  True  True
1  False  True  True

>>> d = {}

>>> for column in df.columns: 
...:     d[column] = [] 
...:     for index, value in enumerate(column): 
...:         if value == True: 
...:             d[column].append((index, [''])) 
...:
>>> d
{'x': [(0, [''])], 'y': [(0, ['']), (1, [''])], 'z': [(0, ['']), (1, [''])]}

Алгоритм улучшен спрашивающим

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'x': [[0] * 6, ['']],
    'y': [[0, np.nan, 0, 1, 0, 1], [4, 3, 5]],
    'q': [[''], ['']],
    'z': [[5, 5, 5, 4, 4, 4], [65, 324, 45.345]]
})

def test(ar):
    if ar == ['']:
        return False
    else:
        return True

new_df = df.applymap(test)
d = {}
for column in new_df.columns: 
    s = new_df[column][new_df[column] == True]
    if s.size >= 1:
        d[column] = []
        for index, value in enumerate(s): 
            if value == True: 
                d[column].append((index, [''])) 
d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...