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

У меня есть фрейм данных, который содержит информацию по столбцам, такую ​​как:

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 для создания столбца Type или есть более разумный способ сделать это?

Редактировать:

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

Вот как выглядят мои данные раньше, многие столбцы разбиты на счетчики: средние пары, я хочу сохранить ихвместе, но если есть строка с двумя счетчиками: средние пары, я хочу, чтобы это было разбито на две строки, где каждая имеет только один соответствующий счетчик: средняя пара.Затем я хочу создать новый столбец с именем «type», который сообщит мне, что такое пара 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 Ответ

1 голос
/ 26 марта 2019

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