Python 将列元素转换为表中的列名

Python 将列元素转换为表中的列名,python,csv,pandas,Python,Csv,Pandas,我有一个大的.csv文件,该文件不断实时更新,显示了数千行,如下所示: 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 将其读入如下数据帧的最快方法是什么: time stock bid ask time1 stockA 1

我有一个大的
.csv
文件,该文件不断实时更新,显示了数千行,如下所示:

 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
将其读入如下数据帧的最快方法是什么:

   time     stock       bid    ask
   time1    stockA      1      
   time2    stockA             1.1
   time3    stockB             2.1
   time4    stockB      2.0    
   time5    stockA      1.1
   time6    stockA             1.2

非常感谢您提供的任何帮助

您可以使用
read_csv
并指定
header=None
并将列名作为列表传递:

In [124]:

t="""time1,stockA,bid,1
 time2,stockA,ask,1.1
 time3,stockB,ask,2.1
 time4,stockB,bid,2.0"""
​
df = pd.read_csv(io.StringIO(t), header=None, names=['time', 'stock', 'bid', 'ask'])
df
Out[124]:
     time   stock  bid  ask
0   time1  stockA  bid  1.0
1   time2  stockA  ask  1.1
2   time3  stockB  ask  2.1
3   time4  stockB  bid  2.0
您必须将bid列重新编码为1或2:

In [126]:

df['bid'] = df['bid'].replace('bid', 1)
df['bid'] = df['bid'].replace('ask', 2)
df
Out[126]:
     time   stock  bid  ask
0   time1  stockA    1  1.0
1   time2  stockA    2  1.1
2   time3  stockB    2  2.1
3   time4  stockB    1  2.0
编辑

根据您更新的样本数据和期望的输出,以下工作:

In [29]:

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"""
​
df = pd.read_csv(io.StringIO(t), header=None, names=['time', 'stock', 'bid', 'ask'])
df
Out[29]:
     time   stock  bid  ask
0   time1  stockA  bid  1.0
1   time2  stockA  ask  1.1
2   time3  stockB  ask  2.1
3   time4  stockB  bid  2.0
4   time5  stockA  bid  1.1
5   time6  stockA  ask  1.2
In [30]:

df.loc[df['bid'] == 'bid', 'bid'] = df['ask']
df.loc[df['bid'] != 'ask', 'ask'] = ''
df.loc[df['bid'] == 'ask','bid'] = ''
df
Out[30]:
     time   stock  bid  ask
0   time1  stockA    1     
1   time2  stockA       1.1
2   time3  stockB       2.1
3   time4  stockB    2     
4   time5  stockA  1.1     
5   time6  stockA       1.2

我认为这是一种更简洁的方式

 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
我认为数据帧应该是这样的。 那就做吧


您可以使用
df.fillna
使用您喜欢的任何内容填充NAN。一般来说,将列值转换为列标题称为数据透视
.unstack
旋转多索引的某一级别。您也可以检查
.pivot

告诉我们你尝试了什么,你在哪里,斯图克我整天都在想这个问题,这让我真的很困惑:-(…我能想到的唯一方法是循环每一行。但这会花费太长的时间。你的更新没有正确显示时间5和6行发生了什么,仍然不清楚1和2关于出价列的真实情况。请再次更新。希望现在更清楚。每一行基本上都提供了时间、股票、价格和te告诉你它是什么类型的价格(例如出价、要价、最后一次、高价等)。我现在正在试验一种解决方案,包括分离出价和请求,然后将它们合并回来。在我的例子中,“出价”列对每只股票有不同的值,所以我不知道用什么值来替换它。你必须决定如何对其进行编码以及它们的含义,如果需要的话,这是一个简单的操作。我编辑了我的考试请允许我展示一下这可能不起作用。或者我只是误解了…?我已经为这个问题添加了一个额外的维度,看看如何修改代码来解决它。@julianlim很抱歉,如果你有另一个问题,请发布另一个问题,逐渐增加问题的范围,这不是一个好的做法
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