Продолжить цикл в pandas df на основе однорядных входов - PullRequest
0 голосов
/ 17 октября 2019

У меня довольно большой фрейм данных, содержащий данные, которые «известны» и «неизвестны». Я пытаюсь создать цикл for (или другое решение), который выполняет итерацию по столбцу определенного кадра данных и заполняет значение каждый раз, когда обнаруживается «известное» значение. Как только это значение найдено, цикл должен заполнить его, пока не будет найдено следующее известное значение. После того, как это новое известное значение найдено, цикл заполняет это новое известное значение и т. Д. Я не могу удалить неизвестные данные.

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

import pandas as pd
example = [{'A':"Value_01"}, {'A':"unknown_x"}, {'A':"Value_02"}, {'A':"random_y"}, {'A':"dontknow_1"}, {'A':"random_x"}, {'A':"Value_03"}, {'A':"dontknow_2"}, {'A':"dontknow_3"}]
df = pd.DataFrame(example)

values = []
for row in df['A']:
    if "Value_01" in row:
        values.append("Value_01")
    elif "Value_02" in row:
        values.append("Value_02")
    elif "Value_03" in row:
        values.append("Value_03")

Пример и желаемый результат:

df                       
Input                   Desired
-------                 --------
Value_01                Value_01
unknown                 Value_01
Value_02                Value_02
unknown                 Value_02
unknown                 Value_02
unknown                 Value_02
Value_03                Value_03
unknown                 Value_03
unknown                 Value_03

Поскольку я использую этот фрагмент кода Python в другой программе, я могу использовать только собственный Python и следующие пакеты: matplotlib, numpy, панды, scikit-Learn, scipy, seaborn и statsmodels. Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 17 октября 2019

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

Вы можете использовать DataFrame.where + Series.str.contains Заполнить значения, неизвестные с помощью DataFrame.ffill:

new_df=df.where(df['A'].str.contains('Value')).ffill()
print(new_df)

Вывод:

          A
0  Value_01
1  Value_01
2  Value_02
3  Value_02
4  Value_02
5  Value_02
6  Value_03
7  Value_03
8  Value_03

Также вы можете использовать DataFrame.mask :

df.mask(~df['A'].str.contains('Value')).ffill()

, если у вас есть список известных значений, которые вы можете использовать isin, как @ splash58 предлагает :

new_df=df.where(df['A'].isin(['Value_01','Value_02', 'Value_03'])).ffill()
...