![](/img/trans.png)
[英]Create a new column in a Pandas DataFrame from exisiting column names
[英]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.