Добавление списка в ячейку в базе фрейма данных на 2 условиях для удаления элементов в каждом списке - PullRequest
0 голосов
/ 07 мая 2020

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

Когда значение в столбце «A» <1, это значение останется в списке, а остальные будут удалены с этим условием буква, имеющая тот же индекс, что и число в столбце "A" </p>

Table

Вывод:

enter image description here

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

Я хотел бы получить совет по этому поводу.


big_a = []
big_b = []

new_list_a = []
new_list_b = []
for a, b in zip(x['COLUMN_A'], x['COLUMN_B']):
    if a < 1:
        new_list_a = []
        new_list_b = []
        new_list_a.append(a)
        new_list_b.append(b)   
        big_a.append(new_list_a)
        big_b.append(new_list_b)    

Это дает мне следующую ошибку:

TypeError: '<' not supported between instances of 'list' and 'int'

Ответы [ 2 ]

1 голос
/ 07 мая 2020
import numpy as np
import pandas as pd

# Create the dataframe
df = pd.DataFrame({
    'A': [[0.99, 1.0, 1.0], [1.0, 1.0, 1.0], [1.0, 0.25, 0.87]],
    'B': [['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']]
})

# Convert the lists to numpy ndarray
df = df.applymap(np.asarray)

# Explode the dataframe
df = df.reset_index().apply(pd.Series.explode).set_index(['index', 'B'])

# Filter for rows whose value for column 'A' is less than 1
df = df[df < 1].dropna().reset_index().groupby('index').agg(list)

Начальный DataFrame:

    A                    B
0   [0.99, 1.0, 1.0]    [a, b, c]
1   [1.0, 1.0, 1.0]     [a, b, c]
2   [1.0, 0.25, 0.87]   [a, b, c]

Окончательный DataFrame будет выглядеть так:

      B     A
index       
0    [a]    [0.99]
2    [b, c] [0.25, 0.87]

Примечания:

Узнайте больше о pandas взорвать здесь .

1 голос
/ 07 мая 2020

это может сработать для вас:

import numpy as np
import pandas as pd 

def process(row):
    np_A = np.array(row.COLUMN_A)
    np_B = np.array(row.COLUMN_B)

    return np_A[np_A<1], np_B[np_A<1] 

df[["NEW_A","NEW_B"]] = df.apply(lambda row: pd.Series(process(row)), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...