2017-06-23 46 views
2

TLDR:我一直试图找到一个内置的解决方案,与转动重复非数值数据,而不在大熊猫聚集,保持所有副本没有成功。我进行了自定义操作,但我想知道是否有更好的方法。枢轴与重复的非数值数据,而不在大熊猫聚集,保持所有复制

我想从这个格式让我的数据:

CAT  FLDNAME Value 
0 CAT 1 DIM1 A 
1 CAT 1 DIM2 B 
2 CAT 1 DIM2 C 
3 CAT 2 DIM1 D 
4 CAT 2 DIM2 E 
5 CAT 2 DIM2  

CAT  DIM1 DIM2 
0 CAT 1 A  B 
1 CAT 1 A  C 
2 CAT 2 D  E 
2 CAT 2 D  

可能性:

No duplicates among grouping columns. Does not require aggregation 

- pivot 
- set_index 

Duplicates among grouping columns. Does require aggregation 

- pivot_table 
- groupby 

按piRSquared的总结中Pivot a pandas DataFrame to be the correct format: `DataError: No numeric types to aggregate`

种所有上述方法都需要既可以当非唯一索引拆垛FLDNAME,或需要聚集。我也用set_index与追加= True和拆垛尝试,但结束了

CAT  DIM1 DIM2 
0 CAT 1 A  
1 CAT 1   B 
2 CAT 1   C 
3 CAT 2 D  
4 CAT 2   E 
4 CAT 2   

但是,我用下面的创建从类别(CAT)和FLDNAME逐步更名为和左加入了分组昏暗的数据帧。

cats = df.CAT.unique() 
df2 = pd.DataFrame(cats, columns=['CAT']) 

for i, grp in df.groupby('FLDNAME'): 
    grp.columns = ['CAT', 'FLDNAME', i] 
    df2 = df2.merge(grp[['CAT', i]], how='left', on='CAT') 

是否有更好的方法可以使用开箱?

回答

1

这是丑陋的!不是我最自豪的时刻。

cols = ['CAT', 'FLDNAME'] 
df.set_index(
    cols + [df.groupby(cols).cumcount()] 
).Value.unstack('FLDNAME').ffill().reset_index(
    1, drop=True 
).rename_axis(None, 1).reset_index() 

    CAT DIM1 DIM2 
0 CAT 1 A B 
1 CAT 1 A C 
2 CAT 2 D E 
+0

我应该多一个问题增加了:我使用的数据集包含空值,即不是所有的猫都的DIM和值一些的DIM是专门为空,所以ffill最终将覆盖空值。抱歉不清楚。 编辑:似乎工作,一旦我删除了ffill! – Mark

+0

另外,这是如何工作的? – Mark