Python Pandas: разделение по шаблону (по строкам) в указанном столбце c в DataFrame - PullRequest
0 голосов
/ 23 апреля 2020

Очень плохо знаком с кодированием и python, поэтому, пожалуйста, потерпите меня. Я искал и смотрел, но не смог найти решение для этого нигде.

У меня есть кадр данных из большой электронной таблицы Excel, где в столбце «Тип газа трассера» (в случайных строках) имеется непрерывный шаблон «1», «2», «1», «2». ... появляется. Эти строки должны быть отделены от остальной части таблицы. Пример раздела кадра данных:

   df = {'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'col2': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'],
                  'Tracer gas type': ['1', '2', '1', '1', '0', '1', '2', '1', '2' ]}
        df = pd.DataFrame(data=df)

Шаблон всегда начинается с 1, может повторяться неизвестное количество раз и заканчивается на 2. В этом примере, если правильно разделить, новый df должен содержать только первые 2 строки и последние 4 строки старого df:

В качестве отправной точки я смог разделить фрейм данных со значениями «1», но не смог разделить «1» , '2', '1', '2' ... разделы с этим методом:

        self.new_df = self.df[self.df['Tracer gas type'] == '1']

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 24 апреля 2020

Я не знаю, есть ли причудливый простой способ напрямую с pandas, но вы могли бы сделать это так с помощью basi c python, перебирая все строки кадра данных следующим образом:

# create a new empty dataset
df_new_data = {
    'col1': []
    , 'col2': []
    , 'Tracer gas type': []
}

last_tgt = ''
this_tgt = ''
# go over all rows in df.values
for row_id in range(0, len(df.values)):
    this_tgt = df.iloc[row_id][2]
    # leave out the first row for comparison
    if(last_tgt != ''): 
        # if the last tgt was 1 and this is 2 then write both rows to the new dataset
        if(this_tgt == '2' and last_tgt == '1'): 
            # print(str(row_id-1) + ' - ' + str(row_id)) # just for debugging
            df_new_data['col1'].append(df.iloc[row_id-1][0])
            df_new_data['col2'].append(df.iloc[row_id-1][1])
            df_new_data['Tracer gas type'].append(df.iloc[row_id-1][2])
            df_new_data['col1'].append(df.iloc[row_id][0])
            df_new_data['col2'].append(df.iloc[row_id][1])
            df_new_data['Tracer gas type'].append(df.iloc[row_id][2])
    # remember this value as 'last value'
    last_tgt = this_tgt

# create new DataFrame from dataset
df_new = pd.DataFrame(df_new_data)
df_new

Это может быть не самый красивый способ, но он даст желаемый результат, который вы дали в качестве примера.

...