数据框在所有列中复制,而不是将数据拆分为不同的列

dataframe getting duplicated int all the columns instead of splitting the data into different columns

我正在通过从报价中收集数据来创建一个字典,然后将字典附加到一个新的数据框中 3 columns ,就像在字典中一样。问题是,字典被附加到数据框中,但数据框的每一列都有附加字典的副本作为单个数据框。对不起,如果我无法清楚地解释这个问题。我对开发非常陌生,非常感谢任何支持。 pycharm 结果的显示方式有问题吗?

此外,有人可以告诉我如何以秒而不是数字为单位计时,以及如何在 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]}

for -> 打印(data_frame.tail()) =

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

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

for -> 打印(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]) 

我认为问题是 data.values() 包含所有 data.You 应该尝试逐行附加它或作为 numpy 数组。如果您要生成一些小数据,我们可以为您提供更多帮助。

问题出在 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())