Как разложить строку фрейма данных для условия?

Я хочу разделить строку из ячейки на новую строку чуть ниже нее.

Сейчас я использую цикл while с оператором if и перебираю первый столбец. Если он содержит строку, которую я ищу, я использую другой цикл while, чтобы добавить пустую строку в конец фрейма данных, а затем копировать каждую строку вниз на одну строку, пока у меня не будет пустая строка после строки, содержащей строку. Затем я копирую строку в эту пустую строку. Это кажется наиболее запутанным способом сделать это.

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

Обычно всякий раз, когда встречается что-то вроде «bla bla (ASTM xxxx)», я хочу выделить «ASTM xxxx». После того, как я сделаю столбец 0 этой новой строки «Методом», а каждый последующий столбец будет «ASTM xxxx».

Текущий рабочий код:

var_row = 0
var_row_length = len(df.index)-1
var_countdown = len(df.index)

while var_row < var_row_length:
    if "ASTM" in str(df.iloc[var_row,0]):
        df = df.append(pd.Series(name=var_countdown))
        while var_countdown > var_row:
            df.loc[var_countdown] = df.loc[var_countdown-1]
            var_countdown -= 1
        df.loc[var_countdown+1]=np.nan
        #copy df.iloc[var_countdown,0] to [var_countdown+1,0], copy over to [var_countdown+1,1], keep ASTM xxxx only
        #ffill the rest of the empty row, profit

        df.loc[var_countdown+1,2]=df.loc[var_countdown,0]
        df.loc[var_countdown+1,2] = re.sub('.*ASTM','ASTM',df.loc[var_countdown+1,2])
        df.iloc[var_countdown+1,2]=df.iloc[var_countdown+1,2].replace('):','')
        df.iloc[var_countdown+1,2:] = df.iloc[var_countdown+1,2:].fillna(method='ffill')

        df.iloc[var_countdown,0]=df.iloc[var_countdown,0].split('(')[0]

        df.iloc[var_countdown+1,1]="Method"
        var_countdown = len(df.index)
        var_row += 1

Я могу найти значения, просто используя это:

df[df[0].str.contains("ASTM", na=False)]

Но я не знаю, как разделить строку «ASTM» на другую строку чуть ниже нее.

Когда я использую explode (), ничего не происходит. И я не знаю, смогу ли я даже взорвать его на выбранной струне. Может быть, с помощью split () и explode () вместе?


person Mitch    schedule 26.08.2019    source источник


Ответы (1)


Я думаю, вы ищете что-то подобное,

mask = df[0].str.contains("ASTM", na=False)
df.loc[mask, 6] = df[0]

взять маску, используя df [0] .str.contains ("ASTM", na = False), создать новый столбец, сохранить только замаскированные значения

person Mohamed Thasin ah    schedule 26.08.2019
comment
Мне нужна новая строка, а не новый столбец. Разве этот код не просто добавит новый столбец в конец? - person Mitch; 26.08.2019
comment
Поэтому для каждой ячейки в столбце 0, содержащей строку xxxx, я хочу добавить новую строку сразу после этой строки. например, df.iloc [5,0] содержит строку xxxx, мне нужна новая строка в df.iloc [6 ,:] - person Mitch; 26.08.2019
comment
@Mitch - я думаю, мой текущий код соответствует вашим требованиям. - person Mohamed Thasin ah; 26.08.2019
comment
Я думаю, что текущий код перезаписывает существующую строку. Мне это нужно, чтобы создать новую строку и вставить ее в фрейм данных. - person Mitch; 26.08.2019
comment
@Mitch - можете ли вы показать образец фрейма данных и ожидаемый результат. - person Mohamed Thasin ah; 26.08.2019