Pandas 具有指定(附加)列的数据透视表
Pandas pivot with specified (additional) columns
我有两个不同的元组列表,它们被转换成 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'])
现在我想从两个数据帧中创建一个枢轴 table,其中的列名称为 类 "A"、"B"、"C" , "D"。因此,所有四个列名(如果可能也以指定的顺序排列)都应该存在于生成的数据透视表 table 中。如果 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
>>>
使用 pandas 中的 .pivot
为 df1
提供了一个枢轴 table,但只有三个 Class 列("A" ,"B","C")。因此,需要修改 dfpivot1
以使列 "A"、"B"、"C" 和 "D" 完全匹配 [=16= 的列].当我从元组列表开始时,其他方法(不使用 pandas
)也可能很有趣。
我认为您需要为所有缺失的列添加 reindex_axis
or reindex
以填充 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
也可以指定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
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
我有两个不同的元组列表,它们被转换成 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'])
现在我想从两个数据帧中创建一个枢轴 table,其中的列名称为 类 "A"、"B"、"C" , "D"。因此,所有四个列名(如果可能也以指定的顺序排列)都应该存在于生成的数据透视表 table 中。如果 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
>>>
使用 pandas 中的 .pivot
为 df1
提供了一个枢轴 table,但只有三个 Class 列("A" ,"B","C")。因此,需要修改 dfpivot1
以使列 "A"、"B"、"C" 和 "D" 完全匹配 [=16= 的列].当我从元组列表开始时,其他方法(不使用 pandas
)也可能很有趣。
我认为您需要为所有缺失的列添加 reindex_axis
or reindex
以填充 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
也可以指定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
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