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