2017-07-15 23 views
1

我有一個數據框字典。我想遍歷每個數據框的列標題,以確保它們以字母開頭。如果他們不以字母開頭,我會添加前綴「c_」。如何創建循環來檢查每個字符串的第一個字符?檢查列標題的起始字符

下面是dataframes代碼:

import os 
import glob 

files = glob.glob(os.path.join("staging" + "/*.csv")) 

print(files) 

# Create an empty dictionary to hold the dataframes from csvs 
dict_ = {} 

# Write the files into the dictionary 
for file in files: 
    fname = os.path.basename(file) 
    fname = fname.replace('.csv', '') 
    dict_[fname] = pd.read_csv(file, header = 0, dtype = str, encoding = 'cp1252').fillna('') 

回答

1

我認爲你可以使用Index.wherestr[0]用於檢查非數字選擇第一個字符,isalpha形成的遮掩,因爲Index.mask尚未實現:

df.columns = df.columns.where(df.columns.str[0].str.isalpha(), 'c_' + df.columns) 

解決方案中循環:

for file in files: 
    fname = os.path.basename(file) 
    fname = fname.replace('.csv', '') 
    dict_[fname] = pd.read_csv(file, header = 0, dtype = str, encoding = 'cp1252').fillna('') 
    mask = dict_[fname].columns.str[0].str.isalpha() 
    dict_[fname].columns = dict_[fname].columns.where(mask, 'c_' + dict_[fname].columns) 

樣品:

df = pd.DataFrame({'1A':list('abcdef'), 
        '3df':[4,5,4,5,5,4], 
        'C':[7,8,9,4,2,3], 
        'D':[1,3,5,7,1,0], 
        'E':[5,3,6,9,2,4], 
        '34F':list('aaabbb')}) 

print (df) 
    1A 34F 3df C D E 
0 a a 4 7 1 5 
1 b a 5 8 3 3 
2 c a 4 9 5 6 
3 d b 5 4 7 9 
4 e b 5 2 1 2 
5 f b 4 3 0 4 

df.columns = df.columns.where(df.columns.str[0].str.isalpha(), 'c_' + df.columns) 
print (df) 
    c_1A c_34F c_3df C D E 
0 a  a  4 7 1 5 
1 b  a  5 8 3 3 
2 c  a  4 9 5 6 
3 d  b  5 4 7 9 
4 e  b  5 2 1 2 
5 f  b  4 3 0 4 

isdigit和仰拱罩類似的解決方案通過~

+0

謝謝你,這個完美! – zsad512

+0

我不明白的是它是如何追加非alpha列的,因爲「mask」= .isalpha()= True ....但我在數據庫中手動檢查了這些文件,並且它們已被追加 – zsad512

+1

它的工作原理,因爲如果有'假'值,'where'工作。所以如果**不是** alpha值加後綴。 – jezrael