数据框在所有列中都被复制,而不是将数据分成不同的列

时间:2019-01-22 11:09:21

标签: python pandas dataframe resampling

我正在通过从刻度收集数据来创建字典,然后将字典附加到具有3 columns的新数据框中,与字典中的相同。问题是,字典将被追加到数据帧中,但是数据帧的每一列都具有一个附加字典的副本作为单个数据帧。对不起,如果我无法清楚地说明问题。我对开发非常陌生,任何支持将不胜感激。 pycharm的bcoz是显示结果的方式吗?

另外,有人可以告诉我如何用秒而不是数字计时,以及如何在LTP列上对附加数据帧进行1分钟的重新采样。

下面是我的代码:

df_cols = ["Token", "LTP", "Volume"]

data_frame = pd.DataFrame(data=[], columns=df_cols, index=[])

def on_ticks(ws, ticks):  # retrive continius ticks in JSON format
    global data_frame, df_cols

data = dict()

for tick in ticks:
    token = tick["instrument_token"]
    ltp = tick["last_price"]
    volume = tick["volume"]
    timestamp = str(datetime.datetime.now().time())

    data[timestamp] = [token, ltp, volume]
    print(data)

tick_df = pd.DataFrame(data.values(), columns=df_cols, index=data.keys())

data_frame = data_frame.append(tick_df)

print(data_frame.tail())

预期结果

for -> print(data) = {'15:27:39.544348': [779521, 290.9, 11236092]}

用于-> print(data_frame.tail())=

    Token     LTP   Volume
15:27:39.544348   779521   290.9  11236092   
15:27:40.144447   779521   290.95 11236092

实际结果 对于-> print(data)= {'15:27:39.544348': [779521, 290.9, 11236092]}

用于-> print(data_frame.tail())=

    Token                           LTP  \
15:27:39.544348   ([779521, 290.9, 11236092])   ([779521, 290.9, 11236092])   
15:27:40.144447  ([779521, 290.95, 11236092])  ([779521, 290.95, 11236092])   
                                       Volume  
15:27:39.544348   ([779521, 290.9, 11236092])  
15:27:40.144447  ([779521, 290.95, 11236092]) 

2 个答案:

答案 0 :(得分:0)

我认为问题在于data.values()包含所有数据。您应该尝试逐行或以numpy数组的形式附加它。如果您会提供一些小数据,我们可以为您提供更多帮助。

答案 1 :(得分:0)

问题出在data.values()上,我想到的一个解决方案是使用 pd.dataframe.append ,但使用方式与您不同:

在循环之前,初始化tick_df:

tick_df = pd.DataFrame(columns=df_cols)

然后在循环中更新tick_df:

for tick in ticks:
    token = tick["instrument_token"]
    ltp = tick["last_price"]
    volume = tick["volume"]
    timestamp = str(datetime.datetime.now().time())

    tick_df = tick_df.append(pd.DataFrame(dict(zip(df_cols,(token,ltp,volume))),index=[timestamp]))

print(tick_df.tail())