我有一个数据帧字典。我想循环遍历每个数据帧的列标题,以确保它们以字母开头。如果他们不以字母开头,我会添加前缀“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('')
答案 0 :(得分:1)
我认为您可以使用Index.where
为str[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