PANDAS重塑数据字段日

时间:2017-05-25 20:38:41

标签: python pandas

示例数据集:

data = {"id":{"0":"1234","1":"1234","2":"4567","3":"4567","4":"4567","5":"89123","6":"89123","7":"89123","8":"18749"},"name":{"0":"bob","1":"rob","2":"bob","3":"rob","4":"sam","5":"bob","6":"rob","7":"sam","8":"dick"}}
df = pd.DataFrame(data=data)

解决方案应该将id列中的每个唯一值作为列,然后将name列中的每个关联值作为该行的值。

我知道我可以通过多种方式做到这一点,我这样做的目的是希望看到所有不同方式的例子。

例如,我看到了这个:

df.groupby('id')['name'].apply(list)

我发现这是一个非常酷的解决方案,但我不确定发生了什么。我假设它正在应用一个函数,将与每个id值关联的所有值转换为列表。我还想知道如何使用stack,unstack,transpose和pivot来解决这个问题。

2 个答案:

答案 0 :(得分:2)

重建

pd.Series(df.name.values, [df.index, df.id.values]).unstack()

   1234 18749  4567 89123
0   bob  None  None  None
1   rob  None  None  None
2  None  None   bob  None
3  None  None   rob  None
4  None  None   sam  None
5  None  None  None   bob
6  None  None  None   rob
7  None  None  None   sam
8  None  dick  None  None

set_index

df.set_index('id', append=True).name.unstack()

   1234 18749  4567 89123
0   bob  None  None  None
1   rob  None  None  None
2  None  None   bob  None
3  None  None   rob  None
4  None  None   sam  None
5  None  None  None   bob
6  None  None  None   rob
7  None  None  None   sam
8  None  dick  None  None

fill_value=''

df.set_index('id', append=True).name.unstack(fill_value='')

id 1234 18749 4567 89123
0   bob                 
1   rob                 
2              bob      
3              rob      
4              sam      
5                    bob
6                    rob
7                    sam
8        dick           

答案 1 :(得分:2)

使用pivot的另一种解决方案。

df.pivot(columns='id',values='name')
Out[280]: 
id  1234 18749  4567 89123
0    bob  None  None  None
1    rob  None  None  None
2   None  None   bob  None
3   None  None   rob  None
4   None  None   sam  None
5   None  None  None   bob
6   None  None  None   rob
7   None  None  None   sam
8   None  dick  None  None