簡體   English   中英

從另一個 Dataframe 的列迭代創建數據幀

[英]Create Dataframes iteratively from columns of another Dataframe

假設我有一個 df:

df = pd.DataFrame({'A.C.1_v': [1, 2, 3], 'B': ['a', 'b', 'c'], 'C.C.1_f': [4, 5, 6], 'D': ['e', 'f', 'g'], 'E': [7, 8, 9]})

注意到感興趣的列是那些 nmae 包括“C.1_letter”

我已經建立了一個對應於所選列的列表:col_list = [A.C.1_v, C.C.1_f]

Objective: 創建幾個dataframe如下(在這個插圖中只構建了 2 個 dfs,但在實踐中可能會有更多)

第一個df

  1. 采用具有以下約定名稱的名稱:“df_AC1_v”
  2. 由列 A.C.1_v 的值以及列 D 和 E 的值組成

因此,對於 df_AC1_v,我們將有以下 output: output 1 沒有迭代

第二個df

  1. 采用具有以下約定名稱的名稱:“df_CC1_f”
  2. 由列 C.C.1_f 的值以及列 D 和 E 的值組成 因此,對於 df_CC1_f,我們將具有以下 output: Output2 without iteration

我的觀點是迭代地執行此操作,但到目前為止,我所嘗試的方法並沒有奏效。

這是我完成的代碼。 它在循環中出錯,我不明白為什么。 首先,我提取 col 列表並創建一個列表,如下所示:

col_list = list(df)
list_c1 = list(filter(lambda x:'.C.1' in x, col_list))
list_c1 = [str(r) for r in list_c1]

輸入: list_c1輸出:['A.C.1_v', 'C.C.1_f']

其次,我隔離“C.1”

list_c1_bis = []
for element in list_c1:
    stock = element.split('.C.1')
    list_c1_bis.append(stock)

輸入: list_c1_bis輸出:[['A', '_v'], ['C', '_f']]

到現在為止,我很開心。 它的錯誤是下面的代碼:

for line in list_c1_bis:
    name1 ='df'+'_'+line[0]+'C1'+line[1]
    vars()[name1] =  df[[list_c1[0],'D','E']]

我的輸出確實如下: in: df_AC1_v ==> OK correct out: output1

在: df_CC1_f ==>錯誤它采用了不合適的列 A.C.1_v,而不是預期的 C.C.1_f output2

歡迎您提出建議!

非常感謝您的時間和幫助,我們將不勝感激

nb:如果您認為您有更好的解決方案,請隨時修改可行的第一步

最親切的問候

我強烈建議您使用varslocalsglobals動態創建變量。 更喜歡用字典。

嘗試

for col in df.columns[df.columns.str.contains(r'[A-Z]\.[0-9]_[a-z]')]:
    name = col.replace('.', '')
    locals()[f"df_{name}"] = df[[col, 'D', 'E']]

更新

如果f-strings不可用(Python < 3.6),請將locals()[f"df_{name}"]替換為locals()["df_{}".format(name)]

Output:

>>> df_AC1_v
   A.C.1_v  D  E
0        1  e  7
1        2  f  8
2        3  g  9

>>> df_CC1_f
   C.C.1_f  D  E
0        4  e  7
1        5  f  8
2        6  g  9

用字典替代

dfs = {}
for col in df.columns[df.columns.str.contains(r'[A-Z]\.[0-9]_[a-z]')]:
    name = col.replace('.', '')
    dfs[name] = df[[col, 'D', 'E']]

Output:

>>> dfs['AC1_v']
   A.C.1_v  D  E
0        1  e  7
1        2  f  8
2        3  g  9

>>> dfs['CC1_f']
   C.C.1_f  D  E
0        4  e  7
1        5  f  8
2        6  g  9

嗨,Corralien,首先讓我感謝您的及時回復,我真的很感激。

我試過第一個代碼

for col in df.columns[df.columns.str.contains(r'[A-Z]\.[0-9]_[a-z]')]:
    name = col.replace('.', '')
    locals()[f"df_{name}"] = df[[col, 'D', 'E']]

但是,我有以下錯誤: File "", line 3 locals()[f"df_{name}"] = df[[col, 'D', 'E']] ^ SyntaxError: invalid syntax

我還嘗試了第二個建議的代碼,它給出了字典下的解決方案。

dfs = {}
for col in df.columns[df.columns.str.contains(r'[A-Z]\.[0-9]_[a-z]')]:
    name = col.replace('.', '')
    dfs[name] = df[[col, 'D', 'E']]

它運行沒有錯誤,但是當我檢查 DF 是否存在時: df_AC1_v

我有以下錯誤: NameError: name 'df_AC1_v' is not defined

我知道要獲得 df,需要這樣寫:dfs['AC1_v']

第二種解決方案是可以接受的,但如果可行的話,我更喜歡第一種解決方案。

最親切的問候

暫無
暫無

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

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