Python 如何通过字典在pandas中创建新行
我对pandas DataFrame有一个问题-我不明白如何创建新行并将它们与字典合并 例如,我有一个数据帧:Python 如何通过字典在pandas中创建新行,python,pandas,Python,Pandas,我对pandas DataFrame有一个问题-我不明白如何创建新行并将它们与字典合并 例如,我有一个数据帧: shops = [{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Rexona', 'Value': 10}, {'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'AXE', 'Value': 20}, {'Chain'
shops = [{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Rexona', 'Value': 10},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'AXE', 'Value': 20},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Old Spice', 'Value': 30},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Camel', 'Value': 40},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Dove', 'Value': 50},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Rexona', 'Value': 10},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'CIF', 'Value': 20},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Old Spice', 'Value': 30},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Camel', 'Value': 40}]
同时,我有一个具有连锁品牌连接的字典数据框:
chain_brands = [{'Chain': 'SeQu', 'Brand': 'Rexona'},
{'Chain': 'SeQu', 'Brand': 'Axe'},
{'Chain': 'SeQu', 'Brand': 'Old Spice'},
{'Chain': 'SeQu', 'Brand': 'Camel'},
{'Chain': 'SeQu', 'Brand': 'Dove'},
{'Chain': 'SeQu', 'Brand': 'CIF'}]
所以,我需要创建新行并用0填充它们,如果brand为Null。应该是这样的:
output = [{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Rexona', 'Value': 10},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'AXE', 'Value': 20},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Old Spice', 'Value': 30},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Camel', 'Value': 40},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'Dove', 'Value': 50},
{'Chain': 'SeQu', 'Shop': 'Rimme', 'Location': 'UK', 'Brand': 'CIF', 'Value': 0},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Rexona', 'Value': 10},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'CIF', 'Value': 20},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Old Spice', 'Value': 30},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Axe', 'Value': 0},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Camel', 'Value': 40},
{'Chain': 'SeQu', 'Shop': 'Rum', 'Location': 'USA', 'Brand': 'Dove', 'Value': 0}]
谢谢 您可以从
chain\u brands
数据框创建一个多索引,然后使用groupby
和reindex
解决此问题:
mi = pd.MultiIndex.from_arrays(chain_brands.values.T, names=['Chain', 'Brand'])
s = shops.set_index(['Chain', 'Brand']).\
groupby(['Location', 'Shop']).\
apply(lambda x: x.reindex(mi, fill_value=0)).\
drop(columns=['Location', 'Shop']).\
reset_index()
结果:
Location Shop Chain Brand Value
0 UK Rimme SeQu Rexona 10
1 UK Rimme SeQu Axe 0
2 UK Rimme SeQu Old Spice 30
3 UK Rimme SeQu Camel 40
4 UK Rimme SeQu Dove 50
5 UK Rimme SeQu CIF 0
6 USA Rum SeQu Rexona 10
7 USA Rum SeQu Axe 0
8 USA Rum SeQu Old Spice 30
9 USA Rum SeQu Camel 40
10 USA Rum SeQu Dove 0
11 USA Rum SeQu CIF 20
为什么“USA Camel”行的
值从40变为0?