Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas 重命名熊猫中的多索引列_Pandas - Fatal编程技术网

Pandas 重命名熊猫中的多索引列

Pandas 重命名熊猫中的多索引列,pandas,Pandas,返回 df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]]) df.columns = pd.MultiIndex.from_tuples((("a", "b"), ("a", "c"), ("d", "f"))) df df.columns.levels[1] 及 返回 df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]]) df.columns = pd.MultiIndex.

返回

df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]])
df.columns = pd.MultiIndex.from_tuples((("a", "b"), ("a", "c"), ("d", "f")))
df
df.columns.levels[1]

返回

df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]])
df.columns = pd.MultiIndex.from_tuples((("a", "b"), ("a", "c"), ("d", "f")))
df
df.columns.levels[1]
我想将
“f”
重命名为
“e”
。据我所说:

但它提高了

df.columns.rename(["b1", "c1", "f1"], level=1)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 df.columns.重命名([“b1”、“c1”、“f1”],级别=1)
C:\Users\USERNAME\AppData\Local\Continuum\Miniconda2\lib\site packages\pandas\index\base.pyc在set\u名称中(self、names、level、inplace)
994如果级别不为“无”且不为“类似于列表”(级别)且为“类似于列表”(
(995人姓名):
-->996 raise TypeError(“名称必须是字符串”)
997
998如果不是类似于列表(名称)且级别为无且self.nlevels>1:
TypeError:名称必须是字符串
我使用
Python 2.7.12 | Continuum Analytics,Inc.|(默认,2016年6月29日,11:07:13)[MSC v.1500 64位(AMD64)]”
pandas 0.19.1

使用:

设置索引的名称,但不重命名列名:

In [22]:
df.columns.set_levels(['b1','c1','f1'],level=1,inplace=True)
df

Out[22]:
     a         d
    b1   c1   f1
0    1    2    3
1   10   20   30
2  100  200  300
这就是为什么在使用参数
level=1时出现错误的原因:

In [26]:
df.columns = df.columns.rename("b1", level=1)
df

Out[26]:
      a         d
b1    b    c    f
0     1    2    3
1    10   20   30
2   100  200  300
还有


另一件您不能做的事情是
df.rename(columns={('d','f'):('e','g')})
,即使它看起来是正确的。换言之:
.rename()
没有达到预期的效果

--卢卡斯

“黑客”方式是这样的(就熊猫1.0.5而言)

那就

def rename_columns(df, columns, inplace=False):
    """Rename dataframe columns.

    Parameters
    ----------
    df : pandas.DataFrame
        Dataframe.
    columns : dict-like
        Alternative to specifying axis. If `df.columns` is
        :obj: `pandas.MultiIndex`-object and has a few levels, pass equal-size tuples.

    Returns
    -------
    pandas.DataFrame or None
        Returns dataframe with modifed columns or ``None`` (depends on `inplace` parameter value).
    
    Examples
    --------
    >>> columns = pd.Index([1, 2, 3])
    >>> df = pd.DataFrame([[1, 2, 3], [10, 20, 30]], columns=columns)
    ...     1   2   3
    ... 0   1   2   3
    ... 1  10  20  30
    >>> rename_columns(df, columns={1 : 10})
    ...    10   2   3
    ... 0   1   2   3
    ... 1  10  20  30
    
    MultiIndex
    
    >>> columns = pd.MultiIndex.from_tuples([("A0", "B0", "C0"), ("A1", "B1", "C1"), ("A2", "B2", "")])
    >>> df = pd.DataFrame([[1, 2, 3], [10, 20, 30]], columns=columns)
    >>> df
    ...    A0  A1  A2
    ...    B0  B1  B2
    ...    C0  C1
    ... 0   1   2   3
    ... 1  10  20  30
    >>> rename_columns(df, columns={("A2", "B2", "") : ("A3", "B3", "")})
    ...    A0  A1  A3
    ...    B0  B1  B3
    ...    C0  C1
    ... 0   1   2   3
    ... 1  10  20  30
    """
    columns_new = []
    for col in df.columns.values:
        if col in columns:
            columns_new.append(columns[col])
        else:
            columns_new.append(col)
    columns_new = pd.Index(columns_new, tupleize_cols=True)

    if inplace:
        df.columns = columns_new
    else:
        df_new = df.copy()
        df_new.columns = columns_new
        return df_new
熊猫队对此有何看法?为什么此行为不是默认行为?

您可以直接使用

假设您拥有以下数据帧

打印(df)
d
b、c、f
0    1    2    3
1   10   20   30
2  100  200  300
df=df.rename(列={'f':'f1','d':'d1'})
您知道,列名映射器与级别无关

假设您拥有以下数据帧

ad
b、f、f
0    1    2    3
1   10   20   30
2  100  200  300
如果要重命名
a
下的
f
,可以执行以下操作

df.columns=df.columns.values
df.columns=pd.MultiIndex.from_元组(df.rename(columns={('a','f'):('a','af')}))

另一件您不能做的事情是
df.rename(columns={('d','f'):('e','g')})
,即使它看起来是正确的。换句话说:
.rename()
并没有达到预期的效果,因为即使每个列的键都是元组,熊猫中的实现也是由两个列表实现的:
df.keys().levels
df.keys().labels
。如果您不想更改该名称的所有匹配项,更改一列的键可能需要将元素附加到
levels
。@Lukas请参阅我在bottomIn
python3
,它是
df.index.set_levels(['b1','c1','f1',level=1,inplace=True)
我认为你的答案缺少参数
level=1
。我认为这个答案解释得最好。
d = dict(zip(df.columns.levels[1], ["b1", "c1", "f1"]))
print (d)
{'c': 'c1', 'b': 'b1', 'f': 'f1'}

df = df.rename(columns=d, level=1)
print (df)
     a         d
    b1   c1   f1
0    1    2    3
1   10   20   30
2  100  200  300
df.index.set_names(["b1", "c1", "f1"], inplace=True)
def rename_columns(df, columns, inplace=False):
    """Rename dataframe columns.

    Parameters
    ----------
    df : pandas.DataFrame
        Dataframe.
    columns : dict-like
        Alternative to specifying axis. If `df.columns` is
        :obj: `pandas.MultiIndex`-object and has a few levels, pass equal-size tuples.

    Returns
    -------
    pandas.DataFrame or None
        Returns dataframe with modifed columns or ``None`` (depends on `inplace` parameter value).
    
    Examples
    --------
    >>> columns = pd.Index([1, 2, 3])
    >>> df = pd.DataFrame([[1, 2, 3], [10, 20, 30]], columns=columns)
    ...     1   2   3
    ... 0   1   2   3
    ... 1  10  20  30
    >>> rename_columns(df, columns={1 : 10})
    ...    10   2   3
    ... 0   1   2   3
    ... 1  10  20  30
    
    MultiIndex
    
    >>> columns = pd.MultiIndex.from_tuples([("A0", "B0", "C0"), ("A1", "B1", "C1"), ("A2", "B2", "")])
    >>> df = pd.DataFrame([[1, 2, 3], [10, 20, 30]], columns=columns)
    >>> df
    ...    A0  A1  A2
    ...    B0  B1  B2
    ...    C0  C1
    ... 0   1   2   3
    ... 1  10  20  30
    >>> rename_columns(df, columns={("A2", "B2", "") : ("A3", "B3", "")})
    ...    A0  A1  A3
    ...    B0  B1  B3
    ...    C0  C1
    ... 0   1   2   3
    ... 1  10  20  30
    """
    columns_new = []
    for col in df.columns.values:
        if col in columns:
            columns_new.append(columns[col])
        else:
            columns_new.append(col)
    columns_new = pd.Index(columns_new, tupleize_cols=True)

    if inplace:
        df.columns = columns_new
    else:
        df_new = df.copy()
        df_new.columns = columns_new
        return df_new
>>> df = pd.DataFrame([[1,2,3], [10,20,30], [100,200,300]])
>>> df.columns = pd.MultiIndex.from_tuples((("a", "b"), ("a", "c"), ("d", "f")))
>>> rename_columns(df, columns={('d', 'f'): ('e', 'g')})
...      a         e
...      b    c    g
... 0    1    2    3
... 1   10   20   30
... 2  100  200  300
print(df)

     a        d1
     b    c   f1
0    1    2    3
1   10   20   30
2  100  200  300
print(df)

     a         d
     b   af    f
0    1    2    3
1   10   20   30
2  100  200  300