Mam nadzieję, że mogę otrzymać pomoc w myśleniu przez problem z Pythona. Mam ogólną księgę danych i chciałbyś usunąć lub obrócić do zera, jakiekolwiek rozliczenia. Wszystko to oznacza, że chcę znaleźć jeden numer w kolumnie i wyszukać go w innej kolumnie. Jeśli znajdę mecz, chcę obrócić obie liczby (liczba iterable i znaleziono numer) do zera.

Wiem, że muszę użyć pewnej formy iterable takich jak:

for x in df[column 1]:
    if x is in df[column 2]:
        x == 0
        df[column 2 [index?]] == 0
    else:
        continue

Czy ktoś mógłby mi pomóc w pisaniu poprawnego kodu, aby to osiągnąć? Moim celem jest dwa zasadniczo itera za pomocą dwóch kolumn, znajdź miejsce, w których dopasowuje się do dwóch wartości i obracaj te wartości na 0. Dziękuję.

0
Ryan 5 czerwiec 2018, 06:30

4 odpowiedzi

Najlepsza odpowiedź

Będziesz chciał użyć wyliczania, aby uzyskać indeks, aby ustawić wartość na liście na zero:

for i, x in enumerate(df[col1]):
    matches = [j for j, y in enumerate(df[col2].isin([x])) if y is True]
    if len(matches) == 0: continue
    df[col1][i] = 0
    k = matches[0]
    df[col2][k] = 0

Jeśli element w DF [COL1] pojawia się w DF [COL2] wiele razy, spowoduje to tylko pierwsze wystąpienie do 0.

Jeśli chcesz usunąć wszystkie zdarzenia, można użyć tego kodu:

for i, x in enumerate(df[col1]):
    matches = [j for j, y in enumerate(df[col2].isin([x])) if y is True]
    if len(matches) == 0: continue
    df[col1][i] = 0
    for k in matches:
        df[col2][k] = 0
1
Jonas 5 czerwiec 2018, 04:15

Myślę, że możesz użyć isin

df[column 1] = df[column 1] * (~df[column 1].isin(df[column 2])
df[column 2] = df[column 2] * (~df[column 2].isin(df[column 1])
0
Lambda 5 czerwiec 2018, 05:43

Możesz to zrobić za pomocą any:

list = ["one", "two", "three"]
foo = ["bannana", "apple", "two", "blue"]

o = []
for x in foo:
    if any(n in x for n in list):
        o.append(0)
    else:
        o.append(x)
print(o)

Które iteruje przez foo i dołącza zero do listy wyjściowej, jeśli mecz zostanie znaleziony w list W przeciwnym razie zwraca wartość, jeśli nie znaleziono dopasowania:

['bannana', 'apple', 0, 'blue']

Aktualizacja:

Właściwie to odpowiada na twoje pytanie lepsze niż moje poprzednie - przy użyciu rozumienia listy:

foo = [[1, 2, 3, 5], [9, 7, 2, 4]]
for x in foo[1]:
    if x in foo[0]:
        foo[0] = [0 if i == x else i for i in foo[0]]
        foo[1] = [0 if i == x else i for i in foo[1]]
print(foo)

foo[0] to lista z elementami, do których należy sprawdzić i foo[1] są przedmiotami, do których należy sprawdzić. To wyjścia [[1, 0, 3, 5], [9, 7, 0, 4]].

0
Paul 5 czerwiec 2018, 05:03
import numpy as np
idx = np.flatnonzero(df['col1'] == df['col2'])
df['col1'][idx] = 0
df['col2'][idx] = 0

Zamiast dokładnych równych, możesz przetestować przybliżoną równość za pomocą {{x0 }}:

idx = np.flatnonzero(np.allclose(df['col1'], df['col2']))
0
AGN Gazer 5 czerwiec 2018, 04:19