我有这个文本文件,我必须加载到pandas数据帧。在加载文本时,我发现没有列名。大约有23列,每列的内容是英文字母的不同字母。我想根据列中的字母表重命名每个列。例如,如果's','b','d'和'f'在第1列中,我想将其重命名为'CapSize',如果是's','r','g','f'和'k'在第2列中我喜欢给它命名为'Root'。
我尝试过这样的事情,但没有出路。
for i in range(23):
if (X.columns[0] == 'b' & X.columns[0] == 'c' & X.columns[0] == 'x'& X.columns[0] == 'f' & X.columns[0] == 'k' & X.columns[0] == 's'):
X.columns[0] = 'Capshape'
print X.columns[0]
答案 0 :(得分:0)
我不完全确定我的问题是正确的,因为字母's'都在CapSize和root中,你是说它必须分别以每个列为条件?
否则,如果我正确地得到它,就像这样:
dt = pd.DataFrame({0:['fb', 'bc'], 1:['baab', 'cbc'], 2:['kaab', 'cbc']})
dt
0 1 2
0 fb baab kaab
1 bc cbc cbc
获取pd.Series的第一个字母
letters = pd.Series(dt.apply(lambda x: x.head(1).map(lambda y: y[0])).loc[0,:].values)
letters
0 f
1 b
2 k
dtype: object
创建用于映射的dict
mp = {x:'CapSize' for x in ['s', 'b', 'd' , 'f'] }
mp.update({x:'Root' for x in [ 'r', 'g', 'f' , 'k']})
mp
{'b': 'CapSize',
'd': 'CapSize',
'f': 'Root',
'g': 'Root',
'k': 'Root',
'r': 'Root',
's': 'CapSize'}
使用dict映射第一个字母
letters = letters.map(mp).tolist()
letters
['Root', 'CapSize', 'Root']
dt.columns = letters
dt
Root CapSize Root
0 fb baab kaab
1 bc cbc cbc
答案 1 :(得分:0)
您可以使用 .issibset()实现它:
dic = {'CapSize':['s','b','d','f'], 'Root':['s','r','g','f','k']}
def col_name(letter_set):
...: for key in dic.keys():
...: if letter_set.issubset(dic[key]): return key
df.columns = [col_name(set(df[column].str[0])) for column in df.columns]