#python #pandas #dataframe
#python #pandas #фрейм данных
Вопрос:
У меня есть фрейм данных, который содержит информацию по столбцам, такую как:
Month Year Cost_1 Cost_2
1 2017 100 0
2 2017 0 100
3 2017 140 30
и я хочу перенести эти данные так, чтобы они приняли вид:
Month Year Cost_1 Cost_2 Type
1 2017 100 0 Cost_1
2 2017 0 100 Cost_2
3 2017 140 0 Cost_1
3 2017 0 30 Cost_2
Моей первоначальной мыслью было использовать .loc(Cost_1> 0, «Type») =»Cost_1″, но это не будет иметь дело со строками, которые имеют как Cost_1, так и Cost_2 и нуждаются в добавлении новой строки? Должен ли я разделить данные так, чтобы сначала они имели только Cost_1 или Cost_2, а затем использовать.loc для создания столбца типа или есть более разумный способ сделать это?
Редактировать:
Проблема на самом деле сложнее, чем я сначала думал. У каждого столбца есть связанный партнер, у Cost_1 есть Count_1, у Cost_2 есть Count_2 .. и т.д.
Year Month BDADExclIncurred_Capped_count BDADExclIncurred_Capped_mean BDTPDIncurred_Capped_count BDTPDIncurred_Capped_mean
0 2015 5 0 NaN 60 900
1 2015 10 0 NaN 0 NaN
2 2015 12 0 NaN 0 NaN
3 2016 1 60 2000 0 NaN
4 2016 1 100 1500 20 600
Так выглядели мои данные раньше, когда многие столбцы были разбиты на пары count: mean, я хочу сохранить их вместе, но если есть строка с двумя парами count: mean, я хочу, чтобы она была разделена на две строки, где каждой соответствует только одна пара count: mean. Затем я хочу создать новый столбец с именем «тип», который сообщает мне, какая пара count: mean связана с этой строкой.
Year Month BDADExclIncurred_Capped_count BDADExclIncurred_Capped_mean BDTPDIncurred_Capped_count BDTPDIncurred_Capped_mean Type
0 2015 5 0 NaN 60 900 TPD
1 2015 10 0 NaN 0 NaN
2 2015 12 0 NaN 0 NaN
3 2016 1 60 2000 0 NaN AD
4 2016 1 100 1500 0 0 AD
5 2016 1 0 0 20 600 TPD
Как показано в этом примере, создается новая строка. Индекс 4 из предыдущего фрейма данных теперь разделен как на индекс 4, так и на индекс 5.
Ответ №1:
Предполагая, что либо только Cost_1
или Cost_2
больше нуля, как следует из вашего примера, вот простой подход для заполнения Type
с помощью Cost_1
и Cost_2
за один шаг:
c = ['Cost_1','Cost_2']
counts = df[c].gt(0).dot(df[c].columns ',').str.rstrip(',').str.split(',')
counts_df = pd.DataFrame(counts.tolist(), columns = ['Count_1', 'Count_2'])
df.assign(**counts_df)
Month Year Cost_1 Count_1 Cost_2 Count_2
0 1 2017 100 Cost_1 0 0
1 2 2017 0 Cost_2 100 0
2 3 2017 140 Cost_1 30 Cost_2
Комментарии:
1. Не приведет ли это просто к созданию нового столбца «Type» без учета разделения строк?
2. Но я не уверен, что вы имеете в виду под разделением строк. Можете ли вы привести пример с такой проблемой и ожидаемый результат, который вы хотели бы получить? @Violatic
3. Я попытался расширить свой вопрос, чтобы лучше объяснить проблему. Когда я использовал ваш метод, он создал тип столбца, но он содержал весь список столбцов без интервалов, а не только один или другой.
4. @Violatic — чвек получил ответ.
5. Да, спасибо @jezrael. Направлялся туда. Но я думаю, что это может быть немного сложнее при назначении этих списков двум новым столбцам. Посмотрим на это сейчас