使用Python&熊猫把平面列表变成矩阵

时间:2016-05-26 12:39:17

标签: python pandas

我有一个csv文件,看起来像:

A, 8.1, pass
B, 8.1, fail
A, 8.2, in-progress
B, 8.2, on-hold
C, 8.2, fail
...
F, 11.1, pass

我想变成一个看起来像这样的文件:

Area   8.1   8.2   8.3   9.1   9.2.............11.1
A      Pass  In-Pr Fail  Pass  On-Hold         Pass
B      Fail  On-Ho Pass  Pass  Fail            Pass
C            Fail        Pass  On-Hold         Fail
...
F      Pass  Pass  On-H  Pass  Pass            Pass

基本上我正在寻找有效的模板代码,它使用pandas将平面列表转换为具有指定值的矩阵,最好使用最少的数据帧。我已经尝试在pandas中使用converters = {}选项但没有成功,因为这会在初始读取时执行。

2 个答案:

答案 0 :(得分:0)

您可以使用pivot_table()pivot()

In [253]: df.pivot_table(index='col1', columns='col2', values='col3', aggfunc='sum', fill_value='')
Out[253]:
col2  8.1          8.2   11.1
col1
A     pass  in-progress
B     fail      on-hold
C                  fail
F                        pass

pivot()

In [250]: df.pivot(index='col1', columns='col2', values='col3')
Out[250]:
col2  8.1          8.2   11.1
col1
A     pass  in-progress  None
B     fail      on-hold  None
C     None         fail  None
F     None         None  pass

DF:

In [251]: df
Out[251]:
  col1  col2         col3
0    A   8.1         pass
1    B   8.1         fail
2    A   8.2  in-progress
3    B   8.2      on-hold
4    C   8.2         fail
5    F  11.1         pass

答案 1 :(得分:0)

设置

text = """A, 8.1, pass
B, 8.1, fail
A, 8.2, in-progress
B, 8.2, on-hold
C, 8.2, fail
F, 11.1, pass"""

df = pd.read_csv(StringIO(text), names=['Area', 'col1', 'col2'])

解决方案

使用set_indexunstack

df.set_index(['Area', 'col1']).unstack()

看起来像:

       col2                     
col1   8.1           8.2    11.1
Area                            
A      pass   in-progress   None
B      fail       on-hold   None
C      None          fail   None
F      None          None   pass

准确了解您发布的内容:

df.set_index(['Area', 'col1']).unstack().col2.rename_axis(None, axis=1).fillna('')

.col2抓取第一级列索引,其值'col2'在显示的输出中删除它。 rename_axisNone应用于列索引的名称,删除输出中显示的col1fillna('')删除了显示输出中的None值。 看起来像:

       8.1           8.2    11.1
Area                            
A      pass   in-progress       
B      fail       on-hold       
C                    fail       
F                           pass