2017-06-23 34 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