【问题标题】:Create MultiIndexed dataframe through constructor通过构造函数创建 MultiIndexed 数据框
【发布时间】:2018-02-07 08:19:54
【问题描述】:

给定两个数组:

x
[('010_628', '2543677'), ('010_228', '2543677'), ('015_634', '2543677')]

y 
array([['me', 10228955],
       ['me', 10228955],
       ['me', 10228955]], dtype=object)

目前,这段代码为我提供了一个带有平面元组索引的数据框:

df = pd.DataFrame(x, index=y, columns=['pm_code',   'sec_pm'])
df
                pm_code   sec_pm
(me, 10228955)  010_628  2543677
(me, 10228955)  010_228  2543677
(me, 10228955)  015_634  2543677

我怎样才能创建一个看起来像这样的MultiIndex 数据框?

                  pm_code   sec_pm
state site_no                     
me    10228955   010_628  2543677
                 010_228  2543677
                 015_634  2543677

我尝试过使用pd.MultiIndex.from_tuples,但我无法做到这一点。感谢您的帮助。


附录:性能比较

# unutbu #1
%timeit pd.DataFrame(x, index=pd.MultiIndex.from_arrays(y.T), columns=['pm_code',   'sec_pm'])
1000 loops, best of 3: 1.25 ms per loop

# unutbu #2
%timeit pd.DataFrame(x, index=pd.MultiIndex.from_tuples(y.tolist()), columns=['pm_code',   'sec_pm'])
1000 loops, best of 3: 1.47 ms per loop

# piRSquared
%timeit pd.DataFrame(x, index=y.T.tolist(), columns=['pm_code', 'sec_pm'])
1000 loops, best of 3: 1.41 ms per loop

# Andrew L
%timeit pd.DataFrame(x, index=[y[:,0], y[:,1]], columns=['pm_code',   'sec_pm'])
1000 loops, best of 3: 1.29 ms per loop

x2 = np.repeat(x, 10000, 0)
y2 = np.repeat(x, 10000, 0)

# unutbu #1
%timeit pd.DataFrame(x2, index=pd.MultiIndex.from_arrays(y2.T), columns=['pm_code',   'sec_pm'])
100 loops, best of 3: 17.3 ms per loop

# unutbu #2
%timeit pd.DataFrame(x2, index=pd.MultiIndex.from_tuples(y2.tolist()), columns=['pm_code',   'sec_pm'])
10 loops, best of 3: 30.5 ms per loop

# piRSquared
%timeit pd.DataFrame(x2, index=y2.T.tolist(), columns=['pm_code', 'sec_pm'])
10 loops, best of 3: 37.2 ms per loop

# Andrew L
%timeit pd.DataFrame(x2, index=[y2[:,0], y2[:,1]], columns=['pm_code',   'sec_pm'])
100 loops, best of 3: 22 ms per loop

来自这个question的数据。

【问题讨论】:

  • 欣赏性能比较!
  • @AndrewL 我为您的回答 +1。很好很优雅。感谢您的回答。

标签: python pandas dataframe multi-index


【解决方案1】:

你可以使用pd.MultiIndex.from_arrays(y.T):

In [53]: pd.DataFrame(x, index=pd.MultiIndex.from_arrays(y.T), columns=['pm_code',   'sec_pm'])
Out[53]: 
             pm_code   sec_pm
me 10228955  010_628  2543677
   10228955  010_228  2543677
   10228955  015_634  2543677

pd.MultiIndex.from_tuples(y.tolist()):

In [54]: pd.DataFrame(x, index=pd.MultiIndex.from_tuples(y.tolist()), columns=['pm_code',   'sec_pm'])
Out[54]: 
             pm_code   sec_pm
me 10228955  010_628  2543677
   10228955  010_228  2543677
   10228955  015_634  2543677

【讨论】:

  • 谢谢,这正是我所需要的。
  • @cᴏʟᴅsᴘᴇᴇᴅ:我认为 piRSquared 建议使用 better option
  • 我明白了。我一般不喜欢在答案之间争吵,但如果你真的觉得他的答案更好,我会做一些测试,发布一些结果,并采取相应的行动。感谢您参与公平的运动。
【解决方案2】:

您还可以对数组进行切片并传递给index

df = pd.DataFrame(x, index=[y[:,0], y[:,1]], columns=['pm_code',   'sec_pm'])

df
             pm_code   sec_pm
me 10228955  010_628  2543677
   10228955  010_228  2543677
   10228955  015_634  2543677

【讨论】:

    【解决方案3】:

    选项 1
    如果你传递一个数组之类的列表,构造函数就知道如何处理它。

    pd.DataFrame(x, index=y.T.tolist(), columns=['pm_code', 'sec_pm'])
    
        pm_code   sec_pm
    me 10228955  010_628  2543677
       10228955  010_228  2543677
       10228955  015_634  2543677
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      相关资源
      最近更新 更多