2017-04-17 6 views
3

这里是大熊猫数据框,我想操纵:透视一个大熊猫数据框是正确的格式:`DataError:没有数字类型aggregate`

import pandas as pd 

data = {"grouping": ["item1", "item1", "item1", "item2", "item2", "item2", "item2", ...], 
     "labels": ["A", "B", "C", "A", "B", "C", "D", ...], 
     "count": [5, 1, 8, 3, 731, 189, 9, ...]} 

df = pd.DataFrame(data) 

print(df) 
>>> grouping   labels  count 
0  item1    A   5 
1  item1    B   1 
2  item1    C   8 
3  item2    A   3 
4  item2    B   731 
5  item2    C   189 
6  item2    D   9 
7  ...    ...   .... 

我想“展开”这个数据帧到格式如下:

grouping A B C D 
item1  5 1 8 3 
item2  3 731 189 9 
....  ........ 

如何做到这一点?我认为这会工作:

pd.pivot_table(df,index=["grouping", "labels"] 

,但我得到了以下错误:

DataError: No numeric types to aggregate 
+1

你的例子枢轴表包括值 “3” 下的 “d”,也就是不存在于原始数据(可能是一个错字)。 – BrenBarn

回答

3

有四种惯用pandas的方式来做到这一点。

  • 分组列之间没有重复。不需要聚合分组列中
    • pivot
    • ​​
  • 重复。是否需要聚合
    • pivot_table
    • groupby

pivot

df.pivot('grouping', 'labels', 'count') 

​​

df.set_index(['grouping', 'labels'])['count'].unstack() 

pivot_table

df.pivot_table('count', 'grouping', 'labels') 

groupby

df.groupby(['grouping', 'labels'])['count'].sum().unstack() 

所有产量

labels  A  B  C D 
grouping       
item1  5.0 1.0 8.0 NaN 
item2  3.0 731.0 189.0 9.0 

时机

enter image description here

随着groupby,​​,或pivot_table方法,您可以轻松地在遗漏值与填充fill_value=0

df.pivot_table('count', 'grouping', 'labels', fill_value=0) 

df.groupby(['grouping', 'labels'])['count'].sum().unstack(fill_value=0) 

df.set_index(['grouping', 'labels'])['count'].sum().unstack(fill_value=0) 

都产生

labels A B C D 
grouping     
item1  5 1 8 0 
item2  3 731 189 9 

groupby

更多的想法因为我们不需要任何聚集。如果我们想要使用groupby,我们可以通过利用影响力较小的聚合器来最小化隐式聚合的影响。

df.groupby(['grouping', 'labels'])['count'].max().unstack() 

df.groupby(['grouping', 'labels'])['count'].first().unstack() 

定时groupby

enter image description here

+0

喔!枢轴比pivot_table快多少的原因是什么? – Vaishali

+2

因为'pivot'不会聚合或尝试聚合。 – piRSquared

3

你把labels在索引中,但希望在列:

>>> df.pivot_table(index='grouping', columns='labels') 
     count     
labels  A  B  C D 
grouping       
item1  5.0 1.0 8.0 NaN 
item2  3.0 731.0 189.0 9.0 

请注意,这使列成为MultiIndex。如果你不想要,明确地通过valuesdf.pivot_table(index='grouping', columns='labels', values='count')

此外,请注意,只有在每个分组和标签组合都具有一个或零个值的情况下,您似乎正在寻找的重塑形式才有可能。如果任何组合出现多次,您需要决定如何聚合它们(例如,通过合计匹配值)。

2

尝试:

In [1]: import pandas as pd 
    ...: 
    ...: data = {"grouping": ["item1", "item1", "item1", "item2", "item2", "item2", "item2"], 
    ...:   "labels": ["A", "B", "C", "A", "B", "C", "D"], 
    ...:   "count": [5, 1, 8, 3, 731, 189, 9]} 
    ...: 
In [2]: df = pd.DataFrame(data) 
In [3]: df.pivot_table(index="grouping",columns="labels") 

Out[3]: 
      count    
    labels  A B C D 
    grouping      
    item1  5 1 8 NaN 
    item2  3 731 189 9 
6

使用​​和unstack

df = df.set_index(['grouping','labels']).unstack().rename_axis(None) 
df.columns = df.columns.droplevel() 
print(df) 

输出:

labels A B C  D 
item1 5 1 8 None 
item2 3 731 189  9 
+1

这很好,而且快得多!+1 – Vaishali

+0

感谢您的支持。对于我的df,我得到'ValueError:索引包含重复的条目,无法重塑' – ShanZhengYang

+0

@ ShanZhengYang看看piRSquared的答案。他指出,如果你有重复的数据,那么你将不得不使用pivot_table或groupby并选择你的聚合函数。 –