来自锯齿状数组的DataFrame

时间:2016-07-11 02:05:08

标签: python list pandas list-comprehension

我有一个如下所示的数据集:

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

以上似乎是实现这一目标的低效方法。 datecountries数组的长度完全相同。基本上date需要以子数组的长度重复。

在熊猫中有这种优雅的方式吗?或者我是否需要像我所做的那样预处理数组?

2 个答案:

答案 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步:使用列表推导,zipitertools.productproduct两个输入列表: [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')]

  • 第3步:形成DataFrame df = pd.DataFrame(list(chain(*[list(product([x],y)) for x, y in zip(date, countries)])), columns= ['date',"countries"])