Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法从另一个不定行长的数据帧动态生成数据帧?_Python_Pandas_Dataframe - Fatal编程技术网

Python 有没有办法从另一个不定行长的数据帧动态生成数据帧?

Python 有没有办法从另一个不定行长的数据帧动态生成数据帧?,python,pandas,dataframe,Python,Pandas,Dataframe,我是Python的业余爱好者/初学者,但我有点被这个问题难住了。我拥有的是一个数据帧,它是对实时数据的API查询的结果。复杂的部分是,这个数据帧可能只产生几列或多列数据,而这不是可以预测或硬编码的。对缺少代码表示歉意:我必须提取并重新塑造数据的代码都工作得很好,但我在这里被难住了 我有一个df(称为data\u-wide),如下所示: Date A1 B1 C1 0 2019-12-02 109.20 123.45 111.21 1

我是Python的业余爱好者/初学者,但我有点被这个问题难住了。我拥有的是一个数据帧,它是对实时数据的API查询的结果。复杂的部分是,这个数据帧可能只产生几列或多列数据,而这不是可以预测或硬编码的。对缺少代码表示歉意:我必须提取并重新塑造数据的代码都工作得很好,但我在这里被难住了

我有一个df(称为
data\u-wide
),如下所示:

     Date         A1      B1      C1
0   2019-12-02  109.20  123.45  111.21 
1   2019-12-03  108.37  133.45  121.56
2   2019-12-05  109.32  154.11  131.34
3   2019-12-06  110.41  187.24  138.55
4   2019-12-09  110.79  201.32  132.42
我想我需要弄清楚如何动态地连接这些列。我需要日期和每个单独的列转换成这样的数据帧,理想情况下以标题字符串命名

     Date         A1     
0   2019-12-02  109.20  
1   2019-12-03  108.37  
2   2019-12-05  109.32  
3   2019-12-06  110.41  
4   2019-12-09  110.79  

但问题是

  • 初始数据帧的列数不确定,因为我是通过API拉取数据生成的,根据查询可能有5列或30列。以前有人遇到过这样的用例吗?我可以手动拉第一组:

  • 对于我进行的每个API查询,列名都将不同,因此不能将它们硬编码为文本值

  • 但是我需要为date列和API请求生成的每个列生成一个dataframe。我觉得我应该能够在for语句的每个循环中增加第二个iloc值,但这似乎是不可能的

    感谢所有对此有建议或见解的人

    您可以尝试:

    dfs = dict()
    for col in data_wide.columns[1:]:
        dfs[col] = data_wide[['Date', col]]
    
    然后,例如,
    dfs['C1']
    返回:

             Date      C1
    0  2019-12-02  111.21
    1  2019-12-03  121.56
    2  2019-12-05  131.34
    3  2019-12-06  138.55
    4  2019-12-09  132.42
    
             Date      B1
    0  2019-12-02  123.45
    1  2019-12-03  133.45
    2  2019-12-05  154.11
    3  2019-12-06  187.24
    4  2019-12-09  201.32
    
    oneliner中的相同解决方案:

    dfs = {k:v for (k,v) in [[col, data_wide[['Date', col]]] for col in data_wide.columns[1:]]}
    
    或者创建数据帧列表

    dfs = [data_wide[['Date', col]] for col in data_wide.columns[1:]]
    
    然后,例如,
    dfs[1]
    返回:

             Date      C1
    0  2019-12-02  111.21
    1  2019-12-03  121.56
    2  2019-12-05  131.34
    3  2019-12-06  138.55
    4  2019-12-09  132.42
    
             Date      B1
    0  2019-12-02  123.45
    1  2019-12-03  133.45
    2  2019-12-05  154.11
    3  2019-12-06  187.24
    4  2019-12-09  201.32
    
    试试这个:

    frames = []
    
    for col in datawide.drop("Date", axis=1).columns:
        frames.append(datawide[["Date", col]])
    
    # 'frames' is a list with all resulting dataframes    
    print(frames[0)]
    
    # prints out to:
    Date    A1
    0   2019-12-02  109.20
    1   2019-12-03  108.37
    2   2019-12-05  109.32
    3   2019-12-06  110.41
    4   2019-12-09  110.79
    

    无论列
    日期
    在您的数据框中的何处,此功能都有效。

    您可以通过单个字典理解生成此功能:

    date\u col=“date”
    dfs={
    col:df.loc[:,[date\u col,col]]
    对于df列中的列
    如果列!=日期列
    }
    
    df[['Date',col\u name\u from\u API]]
    ?虽然列可能不同,但
    'Date'
    是否始终存在?如果是这样,你可以考虑使用它作为你的<代码>索引>代码>,然后在“代码”> DF上对单个系列循环进行切片变得更加容易。列日期将始终存在,列和它们的名称将有所不同。
    。这很好,因为如果日期不是第一列,它不会中断:数据这似乎运行时没有错误,但它是否生成数据帧?我运行了一个
    %who_ls DataFrame
    ,除了我手动创建的数据帧之外,没有看到任何其他内容。@jlgriffiths我假设
    who_ls
    只检查全局命名空间(因此容器内的对象不会显示)。您可以通过运行以下命令来验证这些都是数据帧:
    [assert isinstance(df,pd.DataFrame)for df in dfs.values()]
    。这很有效!我唯一的另一个挑战是如何在事件发生后重命名列,但我认为这是一个小得多的挑战。感谢您的帮助。
    frames = []
    
    for col in datawide.drop("Date", axis=1).columns:
        frames.append(datawide[["Date", col]])
    
    # 'frames' is a list with all resulting dataframes    
    print(frames[0)]
    
    # prints out to:
    Date    A1
    0   2019-12-02  109.20
    1   2019-12-03  108.37
    2   2019-12-05  109.32
    3   2019-12-06  110.41
    4   2019-12-09  110.79