Заменить некоторые странно отформатированные строки df на столбцы - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть фрейм данных с тысячами строк, этот пример df показывает различные типы существующих строк:

df = pd.DataFrame({'col1': ['1', '2', '2', '3'],
                  'col2': ['10', '15', '20', '30'],
                    'col3': ['cat', 'dog', 'cat', 'cat'],
                   'col4': [0.2, 0.9, 'dog', 0.5],
                  'col5': [None, None, 0.3, 'dog'],
                  'col6': [None, None, None, 0.1]})

col1, col2 в порядке как есть.Для остальной части строки я хочу, чтобы cat, dog и catdog стали заголовками столбцов.Если в строке присутствует заголовок столбца, любое значение непосредственно после него должно быть значением в этом столбце.

Правила для каждой строки:

  • Если строка содержит только cat, десятичное значение помещается в столбец cat (dog и catdog столбцы имеют None).
  • Если строка содержит только dog, десятичное значение помещается в *Столбец 1022 * (столбцы cat и catdog имеют None).
  • Если в строке есть и cat, и dog, но только 1 десятичное число, это десятичное число должно быть меньше catdog, а также cat и dog.
  • .Если в строке есть и cat, и dog, но 2 десятичных числа, десятичное число идет под столбцом, который предшествует номеру (с None в catdog).

ДляНапример, в первом ряду 0.2 идет сразу после cat, поэтому он будет идти в этом столбце (в строке с 1 и 10 из col1/col2).

В третьем ряду 0.3 - после "cat, dog", поэтому 0.3 идет во все столбцы: cat, dog и catdog.

Желаемый выход:

dfoutput = pd.DataFrame({'col1': ['1', '2', '2', '3'],
                  'col2': ['10', '15', '20', '30'],
                   'cat': [0.2, None, 0.3, 0.5],
                    'dog': [None, 0.9, 0.3, 0.1],
                    'catdog': [None, None, 0.3, None]})

1 Ответ

0 голосов
/ 14 февраля 2019

Использование np.select и np.where:

cond1 = (df['col3']=='cat') & (df['col4']!='dog')
cond2 = (df['col3']=='cat') & (df['col4']=='dog')
cond3 = df['col3']=='dog'
cond4 = df['col5']=='dog'
cond5 = df['col4']=='dog'

df['cat'] = np.select([cond1, cond2], [df['col4'], df['col5']], None)
df['dog'] = np.select([cond3,cond4,cond5], [df['col4'], df['col6'], df['col5']], None)
df['catdog'] = np.where(cond2, df['col5'], None)

df.drop(['col3','col4','col5','col6'], axis=1, inplace=True)
print(df)

Вывод:

 col1 col2   cat   dog   catdog                                                                                                   
0    1   10  0.2   None  None                                                                                                   
1    2   15  None  0.9   None                                                                                                   
2    2   20  0.3   0.3   0.3                                                                                                   
3    3   30  0.5   0.1   None 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...