【问题标题】:How can I retain multilevel columns if I'm merging two panda dataframes in python?如果我在 python 中合并两个熊猫数据框,如何保留多级列?
【发布时间】:2015-06-09 17:56:42
【问题描述】:

在我的项目中,我使用空的 pandas 数据框初始化了一个对象。在这个对象的一个​​方法中,我创建了另一个具有多级列的数据框。此外,我将第二个数据框与空数据框合并,我希望合并后的数据框也有一个多级列,但多级列将转换为具有我的级别元组的单级列。那么如何在我的新数据框中保留多级列?

一个最小的工作示例:
import pandas as pd
tuples = [(u'obs', u'TMP2m')]
col = pd.MultiIndex.from_tuples(tuples, names=['product', 'variable'])
data = pd.DataFrame()
data1 = pd.DataFrame([1,2,3],columns = col)
data = pd.merge(data, data1, left_index=True, right_index=True, how='outer')
print data

我得到这个输出:

+----------------------+
|        |(obs, TMP2m) |
+----------------------+
| 0      |       1     |
| 1      |       2     |
| 2      |       3     |
+----------------------+

但我希望得到这样的输出:

+------------------+
| product  |   obs |
+------------------+
| variable | TMP2m |
+------------------+
| 0        |     1 |
| 1        |     2 |
| 2        |     3 |
+------------------+

附言我正在使用 Python 2.7.6 和 pandas 0.16.0

修正后的 mwe:

import pandas as pd

class time_series( object ):

    def __init__( self ):
        self.data = pd.DataFrame()

    def add_series ( self, series_data, var ):
        tuples = [(u'obs', var)]
        col = pd.MultiIndex.from_tuples(tuples, names=['product', 'variable'])
        data1 = pd.DataFrame(series_data, columns = col)
        self.data = pd.merge(self.data, data1, left_index=True, right_index=True, how='outer')

【问题讨论】:

    标签: python python-2.7 pandas merge multi-level


    【解决方案1】:

    不知道为什么需要将空数据框与任何东西合并,听起来有点矫枉过正......

    覆盖它就足够了:

    tuples = [('product','obs'), ('variable','TMP2m')]
    col = pd.MultiIndex.from_arrays(tuples)
    data1 = pd.DataFrame([[0,1],[1,2],[2,3]], columns=col)
    print data1
    
       product   obs
      variable TMP2m
    0        0     1
    1        1     2
    2        2     3
    
    data = pd.DataFrame()
    data = data1 # This should be enough to have the end result 
    print data
    
       product   obs
      variable TMP2m
    0        0     1
    1        1     2
    2        2     3
    

    但如果你必须...只需将最后一行替换为:

    data = data.reindex(columns=data1.columns)
    data = pd.merge(data, data1, on=data1.columns.tolist(), how='outer')
    print data
    
       product   obs
      variable TMP2m
    0        0     1
    1        1     2
    2        2     3
    

    【讨论】:

    • 感谢您的回复,这将适用于单个合并,但我想在每次调用该方法时进行合并。所以我认为我的 mwe 错了(在我的第一篇文章末尾更正)。我想我可以使用 df.reindex 作为解决方法,但这只是一种解决方法,因为我认为 pd.merge 例程中会有一个参数来包含多级列名。
    猜你喜欢
    • 2021-09-02
    • 1970-01-01
    • 2019-09-27
    • 2019-12-02
    • 2021-05-30
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多