Как я могу разделить мой фрейм данных на две строки, где два столбца имеют определенные значения?

#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. Направлялся туда. Но я думаю, что это может быть немного сложнее при назначении этих списков двум новым столбцам. Посмотрим на это сейчас