我是使用Python的高级业余爱好者/初学者,但是对此有些困惑。我所拥有的是一个数据帧,它是对实时数据进行API查询的结果。复杂的部分是,此数据帧可能仅导致几列数据或许多列,并且无法预测或进行硬编码。缺乏代码的道歉:我必须提取和重塑数据的代码都运行良好,但是我在这里很困惑。
我有一个看起来像这样的df(称为data_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
和
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
和
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
但是问题是
初始数据帧具有不确定的列数,因为我是通过API提取数据来生成它的,根据查询的不同,可能有5列或30列。之前有没有人遇到过这样的用例? ?我可以手动拉出第一组:
我进行的每个API查询的列名都会不同,因此不能将其硬编码为文本值。
test = data_wide.iloc[:, [0, 1]]
但是我需要为date列以及API请求生成的每一列生成一个数据框。我觉得我应该能够在for语句的每个循环中增加 second iloc值,但这似乎是不可能的。
感谢对此有任何建议或见解的任何人!
答案 0 :(得分:3)
您可以尝试:
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
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 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
答案 1 :(得分:2)
尝试一下:
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
在数据框中的位置如何,此方法都有效。
答案 2 :(得分:1)
您可以通过一个字典理解来生成它:
date_col = "Date"
dfs = {
col: df.loc[:, [date_col, col]]
for col in df.columns
if col != date_col
}