Как найти шаблон во всех столбцах в pandas фрейме данных и, когда его найти, скопировать его в другой столбец - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблема с моим Dataframe. Я импортировал его из pdf-файла, используя tabula, и после многих модификаций я достиг уровня очистки этого

enter image description here

, проблема в том, что некоторые данные были перенесены в справа с разными столбцами я хочу перенести данные из красной области в зеленую область

Я думаю, что решение заключается в поиске с использованием шаблона кода счета (красного цвета) с помощью регулярных выражений (\ d {6} - \ d {4}) во всех столбцах df, и, когда найдет совпадение, скопируйте его в зеленые ячейки

note 1: Я не могу искать по именам столбцов, так как он изменяется от файла к файлу note 2 : нет определенных c неправильных столбцов, в которых отображается код учетной записи, но мы должны искать во всех столбцах

Ответы [ 2 ]

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

Поскольку вы представляли файл Excel без верхней строки, я предположил, что он содержит только строки данных без имен столбцов.

Поэтому я создал файл Excel, содержащий часть ваших исходных данных, прочитайте его Вызов:

df = pd.read_excel('Input.xlsx', header=None)

и получил:

             0   1   2                    3          4          5            6              7        8        9
0  401042-0000 NaN NaN  Masonry Accessories   30105.05    57928.1          NaN            NaN      NaN      NaN 
1  401043-0100 NaN NaN   Brick Masonry unit  763897.00  1237457.0          NaN            NaN      NaN      NaN 
2          NaN NaN NaN                  NaN        NaN        NaN  401079-0000  Joint sealers  18514.6  53145.0 
3          NaN NaN NaN                  NaN        NaN        NaN  401088-0000        Glazing      0.0      0.0 
4  401160-0200 NaN NaN             Conducts  198961.00   198961.0          NaN            NaN      NaN      NaN 
5  401160-0400 NaN NaN   Low Voltage Cables   36403.00    36403.0          NaN            NaN      NaN      NaN 

Задача, которую нужно выполнить, может быть выражена как:

  • в каждой строке,
  • заполнить столбец 0 (updateit) значением из первого последующего соответствия столбца \d{6}-\d{4} шаблон,
  • , если имеется.

Для этого я определил Следующая функция, которая будет применена к каждой строке:

def mtch(row):
    s = row.iloc[1:].str.match(r'\d{6}-\d{4}').fillna(False)
    indLst = s[s].index.tolist()
    return row.loc[indLst[0]] if len(indLst) > 0 else np.nan

Когда вы применяете ее, вызывая: df.apply(mtch, axis=1), результат будет:

0            NaN
1            NaN
2    401079-0000
3    401088-0000
4            NaN
5            NaN
dtype: object

Таким образом, чтобы обновить столбец 0 in df , запустите:

df[0].update(df.apply(mtch, axis=1))

Теперь, когда вы print(df) результат:

             0   1   2                    3          4          5            6              7        8        9
0  401042-0000 NaN NaN  Masonry Accessories   30105.05    57928.1          NaN            NaN      NaN      NaN 
1  401043-0100 NaN NaN   Brick Masonry unit  763897.00  1237457.0          NaN            NaN      NaN      NaN 
2  401079-0000 NaN NaN                  NaN        NaN        NaN  401079-0000  Joint sealers  18514.6  53145.0 
3  401088-0000 NaN NaN                  NaN        NaN        NaN  401088-0000        Glazing      0.0      0.0 
4  401160-0200 NaN NaN             Conducts  198961.00   198961.0          NaN            NaN      NaN      NaN 
5  401160-0400 NaN NaN   Low Voltage Cables   36403.00    36403.0          NaN            NaN      NaN      NaN 

Итак, теперь столбец 0 заполнены 2 пропущенных поля.

Редактировать

Из вашей второй картинки (упомянутой в комментарии) я вижу, что вы, должно быть, сделали некоторые операции, приводящие к очень странному результату.

Обратите внимание:

  • левая часть содержит данные, которым предшествуют имена столбцов ( Безымянный: 0 thru Безымянный: 7 и КОММЕНТАРИЙ (пока все в порядке),
  • , но правая часть содержит строки данных без имен столбцов,
  • и эффект, что первая строка в вашем файле Это смесь имен столбцов и данных.

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

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

Я не очень понимаю примечание в конце вопроса. Но поскольку это датафрейм, заголовок наверняка есть. Допустим, заголовок столбца с зеленой областью называется «Зеленый», а заголовок столбца с красной областью - «Красный»

# df is the dataframe
df["Green"] = df.apply(lambda row : row["Red"] if re.search("\d{6}-\d{4}", row["Red"]) and pd.isnull(row["Green"]) else row["Green"], axis=1)

# if the columns have the same order
col_for_green = df.columns[1]
for col in [c for c in list(df) if c != col_for_green]:
     df[col_for_green] = df.apply(lambda row : row[x] if re.search("\d{6}-\d{4}", row[x]) and pd.isnull(row[col_for_green]) else row[col_for_green], axis=1)

...