【问题标题】:Move columns within Pandas DATA FRAME在 Pandas DATAFRAME 中移动列
【发布时间】:2015-10-19 13:48:24
【问题描述】:

我已将 csv 文件中的数据读取到一个包含超过 25000 行和 15 列的数据框中,我需要将所有行(包括最左边的 -> 索引)向右移动一列,以便我得到一个空索引并能够用整数填充它。但是,列的名称应保留在同一位置。所以,基本上我需要将除列名之外的所有内容都向右移动一个位置。

我尝试重新索引它,但出现错误:

ValueError: cannot reindex from a duplicate axis

有什么办法吗?

【问题讨论】:

    标签: python pandas ipython


    【解决方案1】:

    在 pandas 中,您只能在右侧创建一列,除非您在两个数据框之间进行连接。然后你可以随意重新安排。

    import pandas as pd
    
    df = pd.read_csv('data.csv', header=None, names = ['A','B','C'])
    
    print(df)
    
        A   B   C
    0   1   2   3
    1   4   5   6
    2   7   8   9
    3  10  11  12
    
    df['D'] = pd.np.nan # this creates an empty series
                        # and appends to the right
    
    print(df)
    
        A   B   C   D
    0   1   2   3 NaN
    1   4   5   6 NaN
    2   7   8   9 NaN
    3  10  11  12 NaN
    
    df = df[['D','A','B','C']] # rearrange as you like
    
    print(df)
    
        D   A   B   C
    0 NaN   1   2   3
    1 NaN   4   5   6
    2 NaN   7   8   9
    3 NaN  10  11  12
    

    【讨论】:

    • df['D'] = pd.np.nan 就足够了,而不是 df['D'] = pd.Series(data=None,index=df.index)?
    • @puk789 看来您的数据读取不正确,您可以发布该 csv 文件中的原始数据样本吗?只有几行。
    【解决方案2】:

    我将首先添加一个新列:

    df['new'] = df.index
    

    比在列表中获取数据框列的名称:

    colnames = df.columns.tolist()
    

    然后您可以根据需要重新排列它们,例如更改顺序,以便将最后一个“新”列作为第一列,并将剩余的列向右移动一个位置:

    colnames = colnames[-1:] + colnames[:-1]
    

    并重新分配:

    df = df[colnames]
    

    【讨论】:

      【解决方案3】:
      df = YourDataFrame
      col = "Your Column You Want To Move To The Start Of YourDataFrame" 
      df = pd.concat([df[col],df.drop(col,axis=1)], axis=1)
      

      【讨论】:

        【解决方案4】:

        您可以使用.shift() 方法将数据帧值按列/行滚动一个整数值。

        不完全是您的情况,但您可以在此处找到该方法的一些用例:Shift column in pandas dataframe up by one?

        我观察到了

        df.reset_index().shift(1,axis=1)
        

        将删除索引列中的值并将它们转换为 NaN。

        解决方法是:

        df = df.reset_index()
        values = df.iloc[:,0].values
        df = df.shift(1,axis=1)
        df.iloc[:,1] = values
        

        这是相当多的代码,但我认为符合目的。

        编辑: 我们可以避免创建变量 'values' 并将其分成两行:

        new_df = df.reset_index().shift(1,axis=1)
        new_df.iloc[:,1] = df.reset_index().values[:,0]
        

        【讨论】:

          猜你喜欢
          • 2012-06-14
          • 1970-01-01
          • 2017-08-01
          • 2019-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-05
          相关资源
          最近更新 更多