有没有一种方法可以从行长不确定的另一个数据帧中动态生成数据帧?

时间:2019-12-12 20:11:30

标签: python pandas dataframe

我是使用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

但是问题是

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

  2. 我进行的每个API查询的列名都会不同,因此不能将其硬编码为文本值。

test = data_wide.iloc[:, [0, 1]]

但是我需要为date列以及API请求生成的每一列生成一个数据框。我觉得我应该能够在for语句的每个循环中增加 second iloc值,但这似乎是不可能的。

感谢对此有任何建议或见解的任何人!

3 个答案:

答案 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
}