我有一个数据框,其中包含按列的信息,例如:
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。
答案 0 :(得分: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