在Pandas数据框中将列标题转到第一行,并将行标题转到第一列

时间:2018-11-13 13:27:07

标签: python pandas dataframe indexing

我有一个看起来像这样的数据框:

123  345   456   789
987  876   765   543
...  ...   ...   ...

但是最上面一行和最左边一列实际上是值时,它们被当作标题。无论如何,是否可以将它们向下/向右移动并将其替换为默认索引?

编辑:我已经考虑过设置header = None,但这不是一个选择。数据帧是通过read_excel创建的,但是程序的许多部分已经使用.loc等,并且直接引用要删除的标头名称。

3 个答案:

答案 0 :(得分:3)

对于您的解决方案,您只需进行调整即可。但是,如果您要从任何csv文件中读取数据,则在读取时可以考虑不采用header(header = None)

while (managedCursor.moveToNext()) {
        String callDate = managedCursor.getString(date);
        Date callDayTime = new Date(Long.valueOf(callDate));
        if (<compare callDayTime with a "Date" of one week ago> ){
            String phNumber = managedCursor.getString(number);
            if (<phNumber is equal to the desired Phone>) {
                if(Integer.parseInt(callType) == CallLog.Calls.OUTGOING_TYPE){
                    // User called the phone number last week
                }
            }
        }       
}

出局:

    345 456 789
123         
987 876 765 543

df.reset_index().T.reset_index().T

出局:

         0  1   2   3
index   123 345 456 789
0       987 876 765 543


pd.read_csv('data.csv',header=None)

答案 1 :(得分:1)

使用参数cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project(TokenEngine VERSION 0.0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 14) set(SOURCE_FILES src/Application.cpp src/Application.hpp src/EntryPoint.hpp src/Logger.cpp src/Logger.hpp) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/") add_library(TokenEngine SHARED ${SOURCE_FILES}) #Expose the public API of the engine to any project that might use it target_include_directories(TokenEngine PUBLIC include) ,默认情况下,第一行转换为列名,因此不需要任何参数:

#include <iostream>
#include <fstream>
using namespace std;
struct arrayelement {
  char protein[30];
  int count;
}; 
arrayelement proteins[40];
int main()
{
  char buffer[30];

  // open source file
  ifstream fin("proteins.txt");
  if (!fin) { cerr << "Input file could not be opened\n"; exit(1); }

  // loop through strings in file
  while (fin >> buffer) {
    int index = ((buffer[0] - 65) + (2 * (buffer[strlen(buffer)-1] - 65)) % 40);
    while (true)
    {
        if (proteins[index].protein == buffer)  // Found
        {
            proteins[index].count++;
            break;
        }
        if (proteins[index].protein[0] == 0)    // Empty
        {
            strcpy(proteins[index].protein, buffer); // <-- The error in question
            proteins[index].count++;
            break;
        }
        index++;                                // Collision
     }
  }

  // close file
  fin.close();


  for (int i = 0; i <= 40; i++)
  {
    cout << proteins[i].protein << "\t" << proteins[i].count << "\n";
  }
}

如果输入数据是没有标题的DataFrame:

index_col=[0]

如果可能在数据中使用相同类型的值,则将import pandas as pd temp=u"""123;345;456;789 987;876;765;543""" #after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv' df = pd.read_csv(pd.compat.StringIO(temp), sep=";", index_col=[0]) print (df) 345 456 789 123 987 876 765 543 与索引一起使用:

print (df)
     0    1    2    3
0  123  345  456  789
1  987  876  765  543

#set first row to columns
df.columns = df.iloc[0]
#remove first row from data and remove columns name
df = df.iloc[1:].rename_axis(None, axis=1)
#set index by first column
df = df.set_index(df.columns[0])
print (df)
     345  456  789
123               
987  876  765  543

答案 2 :(得分:0)

创建数据框似乎存在问题。如何创建数据框?您很有可能可以通过创建解决问题

但是,如果不是这样,请尝试以下操作: pandas.DataFrame.reset_index()是您想要的。至于列名,只需使用pandas.DataFrame.append()df.columns作为参数(其中df是您的数据帧)将它们添加为常规行,然后在其后重命名列即可。