具有指定(附加)列的 Pandas 数据透视

Joh*_*nes 5 python pivot pandas

我有两个不同的元组列表,它们被转换为 pandas 数据框:

ls1 = [(1,"A",2),(1,"B",1),(1,"C",3),(2,"A",4),(2,"B",4,),(2,"C",5)]
ls2 = [(1,"A",2),(1,"C",3),(1,"B",1),(1,"D",6),(2,"A",4),(2,"C",5),(2,"B",4,)]
df1 = pandas.DataFrame(ls1, columns=['ID', 'Class', 'count'])
df2 = pandas.DataFrame(ls2, columns=['ID', 'Class', 'count'])
Run Code Online (Sandbox Code Playgroud)

现在我想从两个数据帧创建一个数据透视表,其中包含类“A”、“B”、“C”、“D”的列名称。因此,所有四个列名称(如果可能的话也按指定的顺序)应该存在于生成的数据透视表中。如果 ID-Class 组合没有计数,则应使用 NaN 等填充。

dfpivot1 = df1.pivot(index='ID', columns='Class', values='count')
dfpivot2 = df2.pivot(index='ID', columns='Class', values='count')

>>> dfpivot1
Class  A  B  C
ID            
1      2  1  3
2      4  4  5
>>> 
Run Code Online (Sandbox Code Playgroud)

使用.pivotpandas 提供了 的数据透视表df1,但只有三个类列(“A”、“B”、“C”)。因此,dfpivot1需要修改为具有“A”、“B”、“C”和“D”列,从而与 的列完全匹配dfpivot2。当我从元组列表开始时,其他方法(不使用pandas)可能会很有趣。

jez*_*ael 6

我认为您需要为所有缺失的列添加reindex_axis或reindexfor fill NaN:

cols = ['A','B','C','D']
dfpivot1 = df1.pivot(index='ID', columns='Class', values='count').reindex_axis(cols, axis=1)
print (dfpivot1)
Class  A  B  C   D
ID                
1      2  1  3 NaN
2      4  4  5 NaN
Run Code Online (Sandbox Code Playgroud)

也可以指定fill_value参数:

cols = ['A','B','C','D']
dfpivot1 = df1.pivot(index='ID', columns='Class', values='count')
              .reindex_axis(cols, fill_value=0, axis=1)
print (dfpivot1)
Class  A  B  C  D
ID               
1      2  1  3  0
2      4  4  5  0
Run Code Online (Sandbox Code Playgroud)
cols = ['A','B','C','D']
dfpivot1 = df1.pivot(index='ID', columns='Class', values='count').reindex(columns=cols)
print (dfpivot1)
Class  A  B  C   D
ID                
1      2  1  3 NaN
2      4  4  5 NaN
Run Code Online (Sandbox Code Playgroud)