2015-06-19 119 views
1

我正在尋找一種方法來追加列名列表中的現有列名稱在pandas中的DataFrame中,然後通過col_start + col_add重新排列它們。熊貓追加列表到列名稱列表

DataFrame已包含從col_start列。

喜歡的東西:

import pandas as pd 

df = pd.read_csv(file.csv) 

col_start = ["col_a", "col_b", "col_c"] 
col_add = ["Col_d", "Col_e", "Col_f"] 
df = pd.concat([df,pd.DataFrame(columns = list(col_add))]) #Add columns 
df = df[[col_start.extend(col_add)]] #Rearrange columns 

此外,有沒有一種方法,利用在col_start每個項目的第一個字母,類似於title()capitalize()

+1

你已經有一個列表,所以這將很好地工作:'DF = pd.concat([DF,pd.DataFrame(列= col_add)])',也爲重新排序,這只是工作:'df = df [col_start + col_add]'? – EdChum

+0

如果你想利用'col_start',那麼你可以在使用它進行重命名之前在'col_start'中爲'col_start = [x.title()for x')' – EdChum

+0

你是否要求將列名或每個數據元素大寫爲' col_start'列? – EdChum

回答

1

你的代碼幾乎沒有,有兩件事情:

df = pd.concat([df,pd.DataFrame(columns = list(col_add))]) 

可以簡化爲僅僅以此爲col_add已經是一個列表:

df = pd.concat([df,pd.DataFrame(columns = col_add)]) 

而且你也可以只添加2只列出了一起所以:

df = df[[col_start.extend(col_add)]] 

變成

df = df[col_start+col_add] 

而且能夠利用在列表中的第一個字母只是做:

In [184]: 
col_start = ["col_a", "col_b", "col_c"] 
col_start = [x.title() for x in col_start] 
col_start 

Out[184]: 
['Col_A', 'Col_B', 'Col_C'] 

編輯

爲了避免對資本列名KeyError,你需要在調用concat後利用,該列具有矢量化strtitle方法:

In [187]: 
df = pd.DataFrame(columns = col_start + col_add) 
df 

Out[187]: 
Empty DataFrame 
Columns: [col_a, col_b, col_c, Col_d, Col_e, Col_f] 
Index: [] 

In [188]:  
df.columns = df.columns.str.title() 
df.columns 

Out[188]: 
Index(['Col_A', 'Col_B', 'Col_C', 'Col_D', 'Col_E', 'Col_F'], dtype='object') 
+0

謝謝!如果我不包含大寫函數,代碼將按預期工作。但如果我這樣做,我會得到'KeyError:「[」Col_A「,」Col_B「,」Col_C「]不在索引」'中。看起來它仍然希望在連接時匹配來自DataFrame的列名。 – Winterflags

+0

連接後你必須這樣做,我會更新我的答案 – EdChum

1

在這裏,你想做的事:

import pandas as pd 

#Here you have a first dataframe 
d1 = pd.DataFrame([[1,2,3],[4,5,6]], columns=['col1','col2','col3']) 

#a second one 
d2 = pd.DataFrame([[8,7,3,8],[4,8,6,8]], columns=['col4','col5','col6', 'col7']) 

#Here we can make a dataframe with d1 and d2 
d = pd.concat((d1,d2), axis=1) 

#We want a different order from the columns ? 
d = d[col_start + col_add] 

如果你想從列 '關口' 利用價值,你可以做

d['col'] = d['col'].str.capitalize() 

PS:更新熊貓,如果」名爲.str .capitalize()「不起作用。

或者,你可以做什麼:

df['col'] = df['col'].map(lambda x:x.capitalize()) 
+0

謝謝!我嘗試過它,它的工作原理。 '(columns = col_add)'的連接對我來說效果更好,但是因爲我的使用'd2'從開始就是空的,因此我不必單獨定義它。欣賞'capitalize()'的代碼! – Winterflags