嗨,我想比较熊猫数据帧的相同键。
汽车 | values(dict) | |
---|---|---|
0 | audi1 | {'colour': 'black', 'PS': '3', 'owner': 'peter'} |
1 | audi2 | {'owner': 'fred', 'colour': 'black', 'PS': '230', 'number': '3'} |
2 | 福特 | {'windows': '3', 'PS': '3', 'owner': 'peter'} |
3 | 宝马 | {'colour': 'black', 'windows': 'no', 'owner': 'peter', 'number': '3'} |
想要的解决方案
颜色 | owner | PS | 数字 | windows | |
---|---|---|---|---|---|
黑色 | 3 | 0 | 0 | 0 | 0 |
peter | 0 | 3 | 0 | 0 | 0 |
3 | 0 | 0 | 2 | 2 | 1 |
fred | 0 | 1 | 0 | 0 | 0 |
no | 0 | 0 | 0 | 0 | 1 |
我希望我的问题是可以理解的
d = {'audi1': {'colour': 'black', 'PS': '3', 'owner': 'peter'}, 'audi2': {'owner': 'fred', 'colour': 'black', 'PS': '230', 'number': '3'}, 'ford': {'windows': '3', 'PS': '3', 'owner': 'peter'}, 'bmw': {'colour': 'black', 'windows': 'no', 'owner': 'peter', 'number': '3'}}
df = pd.DataFrame(d.items(), columns=['car', 'values'])
答案 0 :(得分:2)
您可以从值列中的字典创建一个新的数据框,然后 stack
重新调整框架,最后使用 crosstab
创建频率表:
s = pd.DataFrame(df['values'].tolist()).stack()
table = pd.crosstab(s, s.index.get_level_values(1))
使用 groupby
+ value_counts
后跟 unstack
来重塑的替代但相似的方法:
s = pd.DataFrame(df['values'].tolist()).stack()
table = s.groupby(level=1).value_counts().unstack(level=0, fill_value=0)
>>> table
PS colour number owner windows
230 1 0 0 0 0
3 2 0 2 0 1
black 0 3 0 0 0
fred 0 0 0 1 0
no 0 0 0 0 1
peter 0 0 0 3 0