我有一个如下所示的数据集:
date = ['01/01/2001','02/01/2001']
countries = [['US', 'UK', 'AU'],['CN']]
所以基本上数据应该是这样的:
def flatten(array):
return sum(array,[])
pd.DataFrame({'date': flatten([[date[0]]*3, [date[1]]]), 'country': flatten(countries)})
# Which Returns:
country date
0 US 01/01/2001
1 UK 01/01/2001
2 AU 01/01/2001
3 CN 02/01/2001
以上似乎是实现这一目标的低效方法。 date
和countries
数组的长度完全相同。基本上date
需要以子数组的长度重复。
在熊猫中有这种优雅的方式吗?或者我是否需要像我所做的那样预处理数组?
答案 0 :(得分:2)
尝试这样的事情:
DD = []
for x, y in zip(date, countries):
for z in y: DD.append([x,z])
pd.DataFrame(DD, columns= (['date',"countries"]))
date countries
0 01/01/2001 US
1 01/01/2001 UK
2 01/01/2001 AU
3 02/01/2001 CN
答案 1 :(得分:2)
试试我的1-liner:
df = pd.DataFrame(list(chain(*[list(product([x],y)) for x, y in zip(date, countries)])), columns= ['date',"countries"])
<强>解释强>
在这种情况下,基本上itertools
是一个完美的选择,可以用更强的 Pythonic
方式解决问题:
from itertools import chain, product
df = pd.DataFrame(list(chain(*[list(product([x],y)) for x, y in zip(date, countries)])), columns= ['date',"countries"])
df
Out[56]:
date countries
0 01/01/2001 US
1 01/01/2001 UK
2 01/01/2001 AU
3 02/01/2001 CN
更详细的解释:
第1步:使用列表推导,zip
,itertools.product
到product
两个输入列表:
[list(product([x],y)) for x, y in zip(date, countries)]
Out[59]:
[[('01/01/2001', 'US'), ('01/01/2001', 'UK'), ('01/01/2001', 'AU')],
[('02/01/2001', 'CN')]]
第2步:使用list of lists
解包/展平itertools.chain()
。
list(chain(*[list(product([x],y)) for x, y in zip(date, countries)]))
Out[60]:
[('01/01/2001', 'US'),
('01/01/2001', 'UK'),
('01/01/2001', 'AU'),
('02/01/2001', 'CN')]
DataFrame
:
df = pd.DataFrame(list(chain(*[list(product([x],y)) for x, y in zip(date, countries)])), columns= ['date',"countries"])