检查列标题的起始字符

时间:2017-07-15 18:49:43

标签: python pandas dictionary

我有一个数据帧字典。我想循环遍历每个数据帧的列标题,以确保它们以字母开头。如果他们不以字母开头,我会添加前缀“c_”。如何创建循环以检查每个字符串的第一个字符?

以下是数据帧的代码:

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 个答案:

答案 0 :(得分: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的类似解决方案和~反转掩码:

df.columns = df.columns.where(~df.columns.str[0].str.isdigit(), '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