[英]Create multiple dataframes in loop
我有一個列表,每個條目都是一個公司名稱
companies = ['AA', 'AAPL', 'BA', ....., 'YHOO']
我想為列表中的每個條目創建一個新的數據框。
就像是
(偽代碼)
for c in companies:
c = pd.DataFrame()
我一直在尋找一種方法來做到這一點,但找不到。 有任何想法嗎?
只是為了強調我對@maxymoo 的回答的評論,將名稱動態添加到 Python 命名空間幾乎總是一個壞主意(“代碼味道”)。 原因有很多,最突出的是:
創建的名稱可能很容易與您的邏輯已使用的變量發生沖突。
由於名稱是動態創建的,您通常最終也會使用動態技術來檢索數據。
這就是為什么 dicts 被包含在語言中的原因。 正確的操作方法是:
d = {}
for name in companies:
d[name] = pd.DataFrame()
現在你可以編寫一個單獨的dict 理解表達式來做同樣的事情,但有些人發現它不太可讀:
d = {name: pd.DataFrame() for name in companies}
創建d
,公司x
的DataFrame
可以檢索為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))
添加到上述偉大的答案。 如果您需要創建空數據框,但如果您需要基於某些過濾創建多個數據框,則上述內容將完美無缺:
假設您得到的列表是某個數據框的列,並且您想為更大的數據框為每個獨特的公司制作多個數據框:-
首先取公司的唯一名稱:-
compuniquenames = df.company.unique()
創建一個數據框字典來存儲你的數據框
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() 之間的區別請參考以下鏈接:
以下是可重現的 -> 假設您有一個包含 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.