我有一个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 = {}选项但没有成功,因为这会在初始读取时执行。
答案 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_index
和unstack
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_axis
将None
应用于列索引的名称,删除输出中显示的col1
。 fillna('')
删除了显示输出中的None
值。
看起来像:
8.1 8.2 11.1
Area
A pass in-progress
B fail on-hold
C fail
F pass