簡體   English   中英

有沒有辦法從另一個行長度不確定的數據幀動態生成數據幀?

[英]Is there a way to dynamically generate dataframes from another dataframe of indefinite row length?

我是 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]]

但我需要為日期列和 API 請求生成的每一列生成一個數據框。 我覺得我應該能夠在 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

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

試試這個:

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列在數據框中的哪個位置,這都有效。

您可以通過單個字典理解生成它:

date_col = "Date"
dfs = {
   col: df.loc[:, [date_col, col]]
   for col in df.columns
   if col != date_col
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM