如何根据列内容命名pandas dataframe列

时间:2016-08-20 19:00:42

标签: python pandas

我有这个文本文件,我必须加载到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]

2 个答案:

答案 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]