簡體   English   中英

在循環中創建多個數據幀

[英]Create multiple dataframes in loop

我有一個列表,每個條目都是一個公司名稱

companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']

我想為列表中的每個條目創建一個新的數據框。

就像是

(偽代碼)

for c in companies:
     c = pd.DataFrame()

我一直在尋找一種方法來做到這一點,但找不到。 有任何想法嗎?

只是為了強調我對@maxymoo 的回答的評論,將名稱動態添加到 Python 命名空間幾乎總是一個壞主意(“代碼味道”)。 原因有很多,最突出的是:

  1. 創建的名稱可能很容易與您的邏輯已使用的變量發生沖突。

  2. 由於名稱是動態創建的,您通常最終也會使用動態技術來檢索數據。

這就是為什么 dicts 被包含在語言中的原因。 正確的操作方法是:

d = {}
for name in companies:
    d[name] = pd.DataFrame()

現在你可以編寫一個單獨的dict 理解表達式來做同樣的事情,但有些人發現它不太可讀:

d = {name: pd.DataFrame() for name in companies}

創建d ,公司xDataFrame可以檢索為d[x] ,因此您可以很容易地查找特定公司。 要對所有公司進行操作,您通常會使用如下循環:

for name, df in d.items():
    # operate on DataFrame 'df' for company 'name'

在 Python 2 中你寫得更好

for name, df in d.iteritems():

因為這避免了實例化(name, df)元組列表。

你可以這樣做(盡管如果這是面向公眾的代碼,顯然要格外小心地使用exec

for c in companies:
     exec('{} = pd.DataFrame()'.format(c))

添加到上述偉大的答案。 如果您需要創建空數據框,但如果您需要基於某些過濾創建多個數據框,則上述內容將完美無缺:

假設您得到的列表是某個數據框的列,並且您想為更大的數據框為每個獨特的公司制作多個數據框:-

  1. 首先取公司的唯一名稱:-

     compuniquenames = df.company.unique()
  2. 創建一個數據框字典來存儲你的數據框

    companydict = {elem : pd.DataFrame() for elem in compuniquenames}

上面兩個已經在帖子里了:

for key in DataFrameDict.keys():
    DataFrameDict[key] = df[:][df.company == key]

以上將為您提供所有具有匹配記錄的獨特公司的數據框。

下面是在循環中動態創建數據框的代碼:

companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']

for eachCompany in companies:
    #Dynamically create Data frames
    vars()[eachCompany] = pd.DataFrame()

vars(),locals() 和 globals() 之間的區別請參考以下鏈接:

globals()、locals() 和 vars() 之間有什么區別?

以下是可重現的 -> 假設您有一個包含 df/company 名稱的列表:

companies = ['AA', 'AAPL', 'BA', 'YHOO']

你可能也有數據,大概也是一個列表? (或者更確切地說是列表列表),例如:

 content_of_lists = [
 [['a', '1'], ['b', '2']],
 [['c', '3'], ['d', '4']],
 [['e', '5'], ['f', '6']],
 [['g', '7'], ['h', '8']]
]

在這個特殊的例子中,df 應該看起來非常相似,所以這不需要非常復雜:

dic={}
for n,m in zip(companies, range(len(content_of_lists))):
   dic["df_{}".format(n)] = pd.DataFrame(content_of_lists[m]).rename(columns = {0: "col_1", 1:"col_2"}) 

在這里,您必須使用dic["df_AA"]來訪問字典中的數據dic["df_AA"] 但是,如果您需要對數據框進行更多“不同”的命名,我認為您必須使用if-conditions ,例如:

dic={}
    for n,m in zip(companies, range(len(content_of_lists))):
if n == 'AA':
    special_naming_1 = pd.DataFrame(content_of_lists[m]).rename(columns = {0:     
    "col_1", 1:"col_2"})
elif n == 'AAPL':
    special_naming_2 ...

這需要更多的努力,但它允許您通過編寫special_naming_1而不是dic['df_AA']以更傳統的方式獲取數據幀對象,並且如果這很重要,您可以更好地控制數據幀名稱和列名稱。

你可以這樣做:

對於 yyy 中的 xxx:

globals()[f'dataframe_{xxx}'] = pd.Dataframe(xxx)

:D

暫無
暫無

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

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