这是我之前提出的a question。
如何转换以下行:
time1,stockA,bid,1
time2,stockA,ask,1.1
time3,stockB,ask,2.1
time4,stockB,bid,2.0
time5,stockA,bid,1.1
time6,stockA,ask,1.2
time7,stockA,high,1.5
time8,stockA,low,0.5
到以下panda dataframe
:
time stock bid ask high low
time1 stockA 1
time2 stockA 1.1
time3 stockB 2.1
time4 stockB 2.0
time5 stockA 1.1
time6 stockA 1.2
time7 stockA 1.5
time8 stockA 0.5
感谢任何帮助!
答案 0 :(得分:2)
您想要做的是转动表格。 以下方法导致时间和库存形成MultiInde
df = pd.read_csv('prices.csv', header=None, names=['time', 'stock', 'type', 'prices'],
index_col=['time', 'stock', 'type'])
In [1062]:
df
Out[1062]:
prices
time stock type
time1 stockA bid 1.0
time2 stockA ask 1.1
time3 stockB ask 2.1
time4 stockB bid 2.0
time5 stockA bid 1.1
time6 stockA ask 1.2
time7 stockA high1.5
time8 stockA low 0.5
我认为这就是DataFrame的样子。 然后做
In [1064]:
df.unstack()
Out[1064]:
prices
type ask bid high low
time stock
time1 stockA NaN 1.0 NaN NaN
time2 stockA 1.1 NaN NaN NaN
time3 stockB 2.1 NaN NaN NaN
time4 stockB NaN 2.0 NaN NaN
time5 stockA NaN 1.1 NaN NaN
time6 stockA 1.2 NaN NaN NaN
time7 stockA NaN NaN 1.5 NaN
time8 stockA NaN NaN NaN 0.5
您可以使用df.fillna
填写您喜欢的任何内容。一般来说,将列值转换为列标题称为透视。 .unstack
支持MultiIndex的级别。您也可以查看.pivot
。你可以做到
df.columns = df.columns.droplevel(0)
要删除包含每列“价格”的列中的外层
答案 1 :(得分:1)
我的方法是将csv读入2 df,一个有或没有出价问题列:
In [99]:
t="""time1,stockA,bid,1
time2,stockA,ask,1.1
time3,stockB,ask,2.1
time4,stockB,bid,2.0
time5,stockA,bid,1.1
time6,stockA,ask,1.2
time7,stockA,high,1.5
time8,stockA,low,0.5"""
df = pd.read_csv(io.StringIO(t), header=None, names=['time', 'stock', 'bid', 'ask'], usecols=['time', 'stock'])
df
Out[99]:
time stock
0 time1 stockA
1 time2 stockA
2 time3 stockB
3 time4 stockB
4 time5 stockA
5 time6 stockA
6 time7 stockA
7 time8 stockA
对于第二个df,我们可以调用pivot
来旋转df以根据'bid'值创建列,我们需要重置索引然后我们可以将2 df合并在一起以获得所需的结果,如果需要,您可以用空字符串替换NaN值:
In [102]:
df_new = pd.read_csv(io.StringIO(t), header=None, names=['time', 'stock', 'bid', 'ask'], usecols=['time','bid','ask'])
df_new = df_new.pivot(columns ='bid', values='ask', index='time')
df_new = df_new.reset_index()
df = df.merge(df_new)
df
Out[102]:
time stock ask bid high low
0 time1 stockA NaN 1.0 NaN NaN
1 time2 stockA 1.1 NaN NaN NaN
2 time3 stockB 2.1 NaN NaN NaN
3 time4 stockB NaN 2.0 NaN NaN
4 time5 stockA NaN 1.1 NaN NaN
5 time6 stockA 1.2 NaN NaN NaN
6 time7 stockA NaN NaN 1.5 NaN
7 time8 stockA NaN NaN NaN 0.5