Найти конкретный ряд данных из кадра данных Pandas в цикле while - PullRequest
0 голосов
/ 26 октября 2018
  1. Я пытаюсь взять CSV, и прочитать его как Pandas Dataframe.
  2. Этот информационный кадр содержит 4 строки чисел.
  3. Я хочу выбрать конкретную строку данных из кадра данных.
  4. В цикле while я хочу выбрать случайную строку в кадре данных и сравнить ее со строкой, которую я выбрал.
  5. Я хочу, чтобы он продолжал проходить цикл while до тех пор, пока эта случайная строка не станет на 100% равной строке, которую я выбрал ранее.
  6. Затем я хочу, чтобы цикл while прервался, и я хочу, чтобы он посчитал, сколько попыток потребовалось для совпадения со случайным числом.

Вот что у меня так далеко:

Это пример Dataframe:

    A  B  C  D
1   2  7  12 14
2   4  5  11 23
3   4  6  14 20
4   4  7  13 50
5   9  6  14 35

Вот пример моих усилий:

import time
import pandas as pd

then = time.time()

count = 0

df = pd.read_csv('Get_Numbers.csv')
df.columns = ['A', 'B', 'C', 'D']

while True:
    df_elements = df.sample(n=1)
    random_row = df_elements
    print(random_row)
    find_this_row = df['A','B','C','D' == '4','7','13,'50']
    print(find_this_row)
    if find_this_row != random_row:
        count += 1
    else:
        break

print("You found the correct numbers! And it only took " + str(count) + " tries to get there! Your numbers were: " + str(find_this_row))

now = time.time()

print("It took: ", now-then, " seconds")

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

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

Я использую df_elements = df.sample(n=1), чтобы выбрать строку случайным образом.Это было сделано для того, чтобы не использовать random.choice, так как я не был уверен, сработает ли это, или какой способ более эффективен по времени / памяти, но я также открыт для советов по этому поводу.

По-моему, кажетсяпросто, случайным образом выберите строку данных, если она не соответствует строке данных, которую я хочу, продолжайте случайным образом выбирать строки данных, пока они не совпадут.Но я не могу выполнить его.

Любая помощь очень ценится!

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Сначала пара подсказок.Эта строка не работает для меня:

find_this_row = df['A','B','C','D' == '4','7','13,'50']

По двум причинам:

  • пропущенный "'" после, '13
  • df - это DataFrame (), поэтому использование указанных ниже клавиш не поддерживается

df ['A', 'B', 'C', 'D' ...

Или используйте ключи, чтобы вернуть DataFrame ():

df[['A','B','C','D']]

или как Series ():

df['A']

Поскольку вам нужна вся строка с несколькими столбцами, сделайте это:

df2.iloc[4].values

массив (['4', '7', '13', '50'], dtype = object)

Сделайте то же самое с вашей строкой выборки:

df2.sample(n=1).values

Сравнение между строками необходимо выполнить для всех () элементов / столбцов:

df2.sample(n=1).values == df2.iloc[4].values

массив ([[True, False, False, False]])

с добавлением .all (), как показано ниже:

(df2.sample(n=1).values == df2.iloc[4].values).all()

, который возвращает

True / False

Все вместе:

import time
import pandas as pd

then = time.time()
count = 0
while True:
    random_row = df2.sample(n=1).values
    find_this_row = df2.iloc[4].values
    if (random_row == find_this_row).all() == False:
        count += 1
    else:
        break

print("You found the correct numbers! And it only took " + str(count) + " tries to get there! Your numbers were: " + str(find_this_row))

now = time.time()

print("It took: ", now-then, " seconds")
0 голосов
/ 26 октября 2018

Вы можете использовать значения, которые возвращают np.ndarray из shape=(1, 2), используйте values[0], чтобы получить только 1D массив.

Затем сравните массивы с any()

import time
import pandas as pd

then = time.time()

df = pd.DataFrame(data={'A': [1, 2, 3],
                        'B': [8, 9, 10]})

find_this_row = [2, 9]
print("Looking for: {}".format(find_this_row))

count = 0
while True:
    random_row = df.sample(n=1).values[0]
    print(random_row)

    if any(find_this_row != random_row):
        count += 1
    else:
        break

print("You found the correct numbers! And it only took " + str(count) + " tries to get there! Your numbers were: " + str(find_this_row))

now = time.time()

print("It took: ", now-then, " seconds")
0 голосов
/ 26 октября 2018

Вот метод, который проверяет одну строку за раз. Мы проверяем, равны ли values выбранной строки значениям выборки DataFrame. Мы требуем, чтобы они all совпадали.

row = df.sample(1)

counter = 0
not_a_match = True

while not_a_match:
    not_a_match = ~(df.sample(n=1).values == row.values).all()
    counter+=1

print(f'It took {counter} tries and the numbers were\n{row}')
#It took 9 tries and the numbers were
#   A  B   C   D
#4  4  7  13  50

Если вы хотите получить немного быстрее, вы выбираете одну строку, а затем производите выборку DataFrame с заменой много раз. Затем вы можете в первый раз проверить, совпадает ли выбранная строка с вашей выборкой DataFrame, что дает вам количество «попыток», которые потребовалось бы в цикле while, но за гораздо меньшее время. Цикл защищает от маловероятного случая, когда мы не найдем совпадения, учитывая, что это выборка с заменой.

row = df.sample(1)

n = 0
none_match = True
k = 10  # Increase to check more matches at once.

while none_match:
    matches = (df.sample(n=len(df)*k, replace=True).values == row.values).all(1)
    none_match = ~matches.any()  # Determine if none still match
    n += k*len(df)*none_match  # Only increment if none match
n = n + matches.argmax() + 1

print(f'It took {n} tries and the numbers were\n{row}')
#It took 3 tries and the numbers were
#   A  B   C   D
#4  4  7  13  50
0 голосов
/ 26 октября 2018

Как насчет использования values?

values вернет вам список значений. И тогда вы можете легко сравнить два списка.

list1 == list2 вернет массив значений True и False, поскольку он сравнивает индексы соответствующих списков. Вы можете проверить, все ли возвращенные значения True

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...