python: связывание сложных условных изменений данных с использованием панд - PullRequest
0 голосов
/ 16 мая 2018
  1. У меня есть CSV, который может иметь или не всегда иметь одинаковый порядок столбцов или заголовки (следовательно, необходимость вызывать столбцы по имени).
  2. Я использую панд для преобразования электронной таблицы вфрейм данных
  3. я изменяю фрейм данных на основе (надеюсь) модульных, масштабируемых логических значений
  4. я восстанавливаю файл csv:

    df.to_csv('csv / csv_out.csv')

Мне удалось загрузить CSV в кадр данных и условно изменить заголовок столбца (используя следующее:

df = pd.read_csv('csv/csv_in.csv', encoding='utf-8', engine='python', na_values=['.'])

if 'Column Title A' in df.columns:
df.rename(columns = {'Column Title A':'Column Title B'}, inplace = False)

но мне кажется, что я не понимаю синтаксиса, который используется при объединении нескольких операторов if / then, включающих как текстовые, так и числовые значения.

Я попытался df.ix;

dfmod_swheader = df.ix[(df['Column A'] == '12345') | (df['Column A'] == '54321') & 'Column Title B' in df.columns:]

, но последовательно получаю "недопустимое сравнение типов », которое я не могу понять достаточно, чтобы обойти.

Итак, спросите:

Могу ли я получить помощь в правильном синтаксисе для преобразования pandas dataframe, которое достигает следующего:

принять грузредактируемый кадр данных (из csv_in.csv):

Column Name  A,Column Name  B,Column Name Red,Column Name Blue
foo,234,bar,foobar
foo,Box,bar,foobar
foo,12,bar,foobar
foo,9,bar,foobar
foo,1,bar,foobar
foo,Frog,bar,foobar
foo,5567,bar,foobar
foo,12,bar,foobar
foo,a,bar,foobar

и преобразование его (в csv_out.csv):

Column Name  A,Column Name C,Column Name  B,Column Name Red,Column Name Blue
foo,,234,bar,foobar
foo,,Box,bar,foobar
foo,,12,bar,foobar
foo,,9,bar,foobar
,foo,1,bar,foobar
foo,,Frog,bar,foobar
foo,,5567,bar,foobar
foo,,12,bar,foobar
,foo,a,bar,foobar

с использованием следующей логики:

if 'column name a' exists and
'column name b has cell value' = 'numerical value 1' or 'text value a'
then move 'column name a cell value' to (new?) 'column name c',
placing 'column name c' directly to the right of 'column name a'

1 Ответ

0 голосов
/ 17 мая 2018

Я думаю, что вы можете использовать что-то вроде этого, чтобы переместить столбец A в новый столбец при условии.

cond  = df_in['Column Name B'].isin(['1','a'])

df_in['Column Name C'] = df_in.loc[cond,'Column Name A']
df_in['Column Name A'] = df_in['Column Name A'].mask(cond)

Выход:

  Column Name A Column Name B Column Name C
0           foo             1           NaN
1           bar             a           NaN
2           NaN             2        foobar
3           NaN             b        barfoo

Мой вывод:

  Column Name  A Column Name  B Column Name Blue Column Name Red Column Name  C
0            foo            234           foobar             bar            NaN
1            foo            Box           foobar             bar            NaN
2            foo             12           foobar             bar            NaN
3            foo              9           foobar             bar            NaN
4            NaN              1           foobar             bar            foo
5            foo           Frog           foobar             bar            NaN
6            foo           5567           foobar             bar            NaN
7            foo             12           foobar             bar            NaN
8            NaN              a           foobar             bar            foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...