如何将数据框分为两行,其中两列具有特定值?

时间:2019-03-26 10:39:21

标签: python pandas dataframe

我有一个数据框,其中包含按列的信息,例如:

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 

这是我的数据的外观,将许多列分解为count:mean对,我想将它们保持在一起,但是如果有两行count:mean对,我希望将其分成两行,其中每个只有一个对应的count:mean对。然后,我希望创建一个名为“ 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 个答案:

答案 0 :(得分:1)

如您的示例所示,假设仅Cost_1Cost_2都大于零,这是一种用TypeCost_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