python - 转换 Pandas DataFrame,添加行值作为列标题

标签 python pandas dataframe

我有一个像这样的 pandas 数据框:

COMMIT_ID | FILE_NAME     | COMMITTER | CHANGE TYPE
-------------------------------------------------------------
  1       |  package.json | A         | MODIFY
  2       |  main.js      | B         | ADD
  2       |  class.java   | B         | DELETE

我希望文件名的行值作为列标题,并将更改类型作为值。

COMMIT_ID | package.json | main.js     | class.java     | COMMITTER
-----------------------------------------------------------------------------
  1       |  MODIFY      |  NONE       |  NONE          | A         
  2       |  NONE        |  ADD        |  DELETE        | B      

我尝试过 pandas.pivot_table 但不太成功。有机会轻松做到这一点吗?

最佳答案

我认为你需要set_index + unstack :

df = df.set_index(['COMMIT_ID','COMMITTER','FILE_NAME'])['CHANGE TYPE']
       .unstack()
      .reset_index()
print (df)
FILE_NAME  COMMIT_ID COMMITTER class.java main.js package.json
0                  1         A       None    None       MODIFY
1                  2         B     DELETE     ADD         None

解决方案 pivot_table - 需要聚合函数,如 sum (连接不带分隔符的字符串)或 '_'.join (连接带分隔符的字符串)(如果重复):

print (df)
   COMMIT_ID     FILE_NAME COMMITTER CHANGE TYPE
0          1  package.json         A      MODIFY
1          2       main.js         B         ADD
2          2    class.java         B      DELETE
3          2    class.java         B         ADD


df = df.pivot_table(index=['COMMIT_ID','COMMITTER'], 
                    columns='FILE_NAME', 
                    values='CHANGE TYPE', 
                    aggfunc='sum').reset_index()
print (df)
FILE_NAME  COMMIT_ID COMMITTER class.java main.js package.json
0                  1         A       None    None       MODIFY
1                  2         B  DELETEADD     ADD         None

或者:

df = df.pivot_table(index=['COMMIT_ID','COMMITTER'], 
                    columns='FILE_NAME', 
                    values='CHANGE TYPE', 
                    aggfunc='_'.join).reset_index()
print (df)
FILE_NAME  COMMIT_ID COMMITTER  class.java main.js package.json
0                  1         A        None    None       MODIFY
1                  2         B  DELETE_ADD     ADD         None

使用 first 聚合也可以,但您可能会丢失重复值:

df = df.pivot_table(index=['COMMIT_ID','COMMITTER'], 
                    columns='FILE_NAME', 
                    values='CHANGE TYPE', 
                    aggfunc='first').reset_index()
print (df)
FILE_NAME  COMMIT_ID COMMITTER class.java main.js package.json
0                  1         A       None    None       MODIFY
1                  2         B     DELETE     ADD         None

重命名列名称的最后一个添加 rename_axis :

df = df.rename_axis(None, axis=1)
print (df)
   COMMIT_ID COMMITTER class.java main.js package.json
0          1         A       None    None       MODIFY
1          2         B  DELETEADD     ADD         None

关于python - 转换 Pandas DataFrame,添加行值作为列标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43998879/

相关文章:

python - panda python groupby 取决于其他列表

python - 如何使用列共享项目的百分比创建新的 pandas DataFrame

Python MySQLdb 执行表变量

python - 使用 matplotlib 绘制图像

Python/Pandas HDF5 NameError 问题

python - 在 Python 中,如何检查一个数组是否包含另一个数组/列表的所有元素,包括重复项?

python - 基于具有默认值的形状创建 DataFrame

python - Pandas 有条件地创建系列/数据框列

python - Pandas:更改数据帧日期索引格式

python - 当列名与 Pandas 的数据内联时,如何读取 .txt 文件?