Python 有没有办法从另一个不定行长的数据帧动态生成数据帧?
我是Python的业余爱好者/初学者,但我有点被这个问题难住了。我拥有的是一个数据帧,它是对实时数据的API查询的结果。复杂的部分是,这个数据帧可能只产生几列或多列数据,而这不是可以预测或硬编码的。对缺少代码表示歉意:我必须提取并重新塑造数据的代码都工作得很好,但我在这里被难住了 我有一个df(称为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
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
及
及
但问题是
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