Создание нового столбца DataFrame со строковыми значениями CSV, представляющими условия существующих столбцов - PullRequest
1 голос
/ 08 июля 2020

У меня есть фрейм данных len (df) = 143213 из 47 столбцов. Я хочу добавить новый столбец, который может содержать несколько значений, разделенных запятыми.

В настоящее время я делаю:

df['1'] = np.where((df.column_1 == ‘VALUE’) & (df.column_2 != df.column_3), 'AMOUNT ', '')
df['2'] = np.where((df.column_1 == ‘VALUE’) & (df.column_4 != df.column_5), 'QTY ', '')
df['3'] = np.where((df.column_1 == ‘VALUE’) & (df.column_2 != df.column_6), 'CC ', '')
df['4'] = np.where((df.column_1 == ‘VALUE’) & (df.column_12 <=0), 'MT ' , '')

……….

df['9'] = np.where((df.column_1 == ‘VALUE_2’) & (df.column_7 != df.column_9), 'SPP ', '')

df['10'] = np.where((df.column_1 == ‘VALUE_2’) & (df.column_7 != df.column_10), 'TC', '')

df['11'] = np.where((df. column_1 == ' VALUE_2') & (df.column_11 <=df.column_13) & (df.column_11>df.column_14) & (df.column_12 <=0 ), 'R_AMT ', '')

… и так далее

Я создал около 33 df ['33 '] в зависимости от различных условий.

После этого я делаю:

df['new'] = df['1'] + df['2'] +df['3']+ df['4']+ df['5']+ df['6'] + df['7'] + df['8'] + df['9']+ df['10'] + df['11']+ ………d[‘33’]

df['new1'] = df['new'].str.strip(' ')

df['required'] = df['new1'].apply(lambda x: x.replace(' ', ','))

, а затем отбрасываю столбцы.

Есть ли лучший способ сделать это? Я попробовал np.select, но мне кажется, что это не лучший вариант, когда могут быть выполнены несколько условий.

1 Ответ

1 голос
/ 08 июля 2020

Я не уверен, есть ли способ векторизовать это с помощью Pandas примитивов, но это можно сделать немного более эффективно и чисто, чем в вашем примере. Например, добавление цепочки типа df['1']+df['2']+df['3']+... не является хорошей идеей, потому что каждый + будет выделять новый объект Series; кроме того, добавление строк не очень эффективно в Python.

import pandas as pd
import numpy as np

# Create example dataframe
df = pd.DataFrame(dict(col1=[1, 2, 3, 4, 5], col2=[1, 4, 3, 3, 7]))

# Store the output of the conditions as boolean values in an empty 
# dataframe.
tmp_df = pd.DataFrame(index=df.index)
tmp_df['EQUAL'] = df['col1'] == df['col2']
tmp_df['EVENSUM'] = ((df['col1'] + df['col2']) % 2 == 0)
print(f'tmp_df:\n{tmp_df}')

# This is te slow part.
# iterrows() returns tuples (index, row_as_series).
df['required'] = [
        ','.join(r[r].index)
        for _, r in tmp_df.iterrows()
   ]
print(f'df:\n{df}')

Вывод:

tmp_df:
   EQUAL  EVENSUM
0   True     True
1  False     True
2   True     True
3  False    False
4  False     True
df:
   col1  col2       required
0     1     1  EQUAL,EVENSUM
1     2     4        EVENSUM
2     3     3  EQUAL,EVENSUM
3     4     3               
4     5     7        EVENSUM
...