簡體   English   中英

在具有動態名稱的熊貓中創建新數據框也添加新列

[英]Create new dataframe in pandas with dynamic names also add new column

我有一個數據框 df

 df = pd.DataFrame({'A':['-a',1,'a'], 
               'B':['a',np.nan,'c'],
               'ID':[1,2,2],
                't':[pd.tslib.Timestamp.now(),pd.tslib.Timestamp.now(),
                    np.nan]})

添加了一個新列

df['YearMonth'] = df['t'].map(lambda x: 100*x.year + x.month)

現在我想編寫一個函數或宏來進行日期比較,創建一個新的數據框並向數據框添加一個新列。

我試過這樣,但似乎我錯了:

def test(df,ym):
    df_new=df
    if(ym <= df['YearMonth']):
        df_new+"_"+ym=df_new
        return df_new+"_"+ym
    df_new+"_"+ym['new_col']=ym

現在,當我調用測試函數時,我希望創建一個名為df_new_201612的新數據框,並且這個新數據框應該還有一個名為new_col的列,所有行的值為ym

test(df,201612)

新數據幀的輸出為:

df_new_201612

A   B   ID  t                           YearMonth   new_col
-a  a   1   2016-12-05 12:37:56.374620  201612      201612 
1   NaN 2   2016-12-05 12:37:56.374644  201208      201612 
a   c   2   nat                         nan         201612 

使用動態名稱創建變量通常是一種不好的做法。

我認為您的問題的最佳解決方案是將您的數據幀存儲到字典中並動態生成訪問每個數據幀的鍵名。

import copy

dict_of_df = {}
for ym in [201511, 201612, 201710]:

    key_name = 'df_new_'+str(ym)    

    dict_of_df[key_name] = copy.deepcopy(df)

    to_change = df['YearMonth']< ym
    dict_of_df[key_name].loc[to_change, 'new_col'] = ym   

dict_of_df.keys()
Out[36]: ['df_new_201710', 'df_new_201612', 'df_new_201511']

dict_of_df
Out[37]: 
{'df_new_201511':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201612
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201612
 2   a    c   2 2016-12-05 07:53:35.943     201612   201612,
 'df_new_201612':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201612
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201612
 2   a    c   2 2016-12-05 07:53:35.943     201612   201612,
 'df_new_201710':     A    B  ID                       t  YearMonth  new_col
 0  -a    a   1 2016-12-05 07:53:35.943     201612   201710
 1   1  NaN   2 2016-12-05 07:53:35.943     201612   201710
 2   a    c   2 2016-12-05 07:53:35.943     201612   201710}

 # Extract a single dataframe
 df_2015 = dict_of_df['df_new_201511']

使用exec方法有一種更簡單的方法來完成此操作。 可以執行以下步驟以在運行時創建數據框。

1.使用一些隨機值創建源數據框。

import numpy as np
import pandas as pd
    
df = pd.DataFrame({'A':['-a',1,'a'], 
                   'B':['a',np.nan,'c'],
                   'ID':[1,2,2]})

2.分配一個包含新數據框名稱的變量。 您甚至可以將此值作為參數發送或動態循環它。

new_df_name = 'df_201612'

3.使用exec方法動態創建數據幀,將數據從源數據幀動態復制到新數據幀,並在下一行為新列賦值。

exec(f'{new_df_name} = df.copy()')
exec(f'{new_df_name}["new_col"] = 123') 

4.現在數據幀df_201612將在內存中可用,您可以執行print語句和eval來驗證這一點。

print(eval(new_df_name))

暫無
暫無

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

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