Сравнение нескольких столбцов одного файла CSV и возврат результата в другой файл CSV с использованием Python - PullRequest
0 голосов
/ 07 августа 2020

У меня есть CSV-файл с 7 столбцами

Это мой CSV-файл

Application,Expected Value,ADER,UGOM,PRD
APP,CVD2,CVD2,CVD2,CVD2
APP1,"VCF7,hg6","VCF7,hg6","VCF8,hg6","VCF7,hg6"
APP1,"VDF9,pova8","VDF9,pova8","VDF10,pova10","VDF9,pova11"
APP2,gf8,gf8,gf8,gf8
APP3,pf8,pf8,gf8,pf8
APP4,vd3,mn7","vd3,mn7","vd3,mn7","vd3,mn7"

Итак, здесь я хочу сравнить столбец Ожидаемое значение со столбцами после этого (то есть ADER, UGOM, PRD)

так вот мой код в python

    import pandas as pd
    
    # assuming id columns are identical and contain the same values
    df1 = pd.read_csv('file1.csv', index_col='Expected Value')
    df2 = pd.read_csv('file1.csv', index_col='ADER')
    
    df3 = pd.DataFrame(columns=['status'], index=df1.index)
    df3['status'] = (df1['Expected Value'] == df2['ADER']).replace([True, False], ['Matching', 'Not Matching'])
    
    df3.to_csv('output.csv')

Таким образом, это не создает файл output.csv , и не генерирует никаких выходных данных. Так может ли кто-нибудь помочь

Итак, я отредактировал код: на основе комментария @Vlado

import pandas as pd

# assuming id columns are identical and contain the same values
df1 = pd.read_csv('first.csv')
df3 = pd.DataFrame(columns=['Application','Expected Value','ADER','status of AdER'], index=df1.index)
df3['Application']  = df1['Application']
df3['Expected Value']  = df1['Expected Value']
df3['ADER']  = df1['ADER']

df3['status'] = (df1['Expected Value'] == df1['ADER'])

df3['status'].replace([True, False], ['Matching', 'Not Matching'])
df3.to_csv('output.csv')

, так что теперь он работает для одного столбца ADER, но мои заголовки после Ожидаемые значения - динамические c, они могут измениться. поэтому иногда это может быть один столбец после ожидаемого значения, иногда N столбцов и имя заголовка также могут измениться. так что кто-нибудь может помочь о том, как это сделать

Ответы [ 3 ]

0 голосов
/ 07 августа 2020

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

import pandas as pd
df = pd.read_csv("input.csv")

expected_value_index = df.columns.get_loc("Expected Value")
for col_index in range(expected_value_index+1, len(df.columns)):
    column = df.columns[expected_value_index]+" & "+ df.columns[col_index]
    df[column] = df.loc[:,"Expected Value"] == df.iloc[:,col_index]
    df[column].replace([True, False], ["Matching", "No Matching"], inplace=True)

df.to_csv("output.csv", index=None)
0 голосов
/ 07 августа 2020

Попробуйте этот код

k = list(df1.columns).index('Expected Value') + 1
    # get the integer index for the column after 'Expected Value'
df3 = df1.iloc[:, :k]
    # copy first k columns
df3 = pd.concat([df3, (df1.iloc[:, k:] == np.repeat(
    df1['Expected Value'].to_frame().values, df1.shape[1] - k, axis=1))], axis=1)
    # slice df1 with iloc, wich works just as slicing lists in python
    # np.repeat, used to repeat 'Expected Value' as many columns as needed (df1.shape[1]-k=3)
    # .to_frame, slicing a column from a df returns a 1D series so we turin it back into a 2D df
    # .values, returns the underlying numpy array without any index/column names
        # ...without .values Pandas would try to find 3 columns named 'Expected Value' in df1
    # concatenate previous df3 with this calculation
print(df3)

Вывод

  Application   FileName   ConfigVariable Expected Value  ADER   UGOM    PRD
0        APP1  FileName1  ConfigVariable1           CVD2  True   True   True
1        APP1  FileName2  ConfigVariable2       VCF7,hg6  True  False   True
2        APP1  FileName3  ConfigVariable3     VDF9,pova8  True  False  False
3        APP2  FileName4  ConfigVariable4            gf8  True   True   True
4        APP3  FileName5  ConfigVariable5            pf8  True  False   True
5        APP4  FileName6   ConfigVariable        vd3,mn7  True   True   True

Конечно, вы можете сделать al oop, если по какой-то причине вам нужен специальный расчет для некоторого столбца

for colname in df1.columns[k:]:
    df3[colname] = df1[colname] == df1['Expected Value']
0 голосов
/ 07 августа 2020

Я пока не пробовал реплицировать ваш код, но вот несколько предложений:

Вам не нужно читать df два раза. df1 = pd.read_csv ('FinalResult1.csv') достаточно.

Затем вы можете продолжить с

df1 ['status'] = (df1 ['exp'] == df1 ['ader'])

df1 ['status']. replace ([True, False], ['Matching', 'Not Matching'])

В качестве альтернативы вы можете сделать это строка за строкой, используя метод pandas apply. Если это не сработает, разумным первым шагом будет распечатать фрейм данных, чтобы увидеть, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...