使用列名称--Python,Pandas在所有列上应用函数

时间:2017-05-02 19:29:23

标签: python pandas

基本上:

有没有办法在Pandas中应用使用数据框列名的函数? 像这样:

df['label'] = df.apply(lambda x: '_'.join(labels_dict[column_name][x]), axis=1)

列名称是apply为'处理'的列。

详细说明:

我想基于字典为数据帧的每一行创建一个标签。

我们来看一下数据框df

df = pd.DataFrame({ 'Application': ['Compressors', 'Fans', 'Fans', 'Material Handling'],
                'HP': ['0.25', '0.25', '3.0', '15.0'],
                'Sector': ['Commercial', 'Industrial', 'Commercial', 'Residential']},
                index=[0, 1, 2, 3])

我申请标签后:

In [139]: df['label'] = df.apply(lambda x: '_'.join(x), axis=1)

In [140]: df
Out[140]:
         Application    HP       Sector                               label
0        Compressors  0.25   Commercial         Compressors_0.25_Commercial
1               Fans  0.25   Industrial                Fans_0.25_Industrial
2               Fans   3.0   Commercial                 Fans_3.0_Commercial
3  Material Handling  15.0  Residential  Material Handling_15.0_Residential

但是标签太长了,特别是当我考虑包含更多列的完整数据帧时。我想要的是使用字典来缩短列中的字段(我在问题的最后粘贴了字典的代码)。

我可以为一个领域做到这一点:

In [145]: df['application_label'] = df['Application'].apply(
                                               lambda x: labels_dict['Application'][x])

In [146]: df
Out[146]:
         Application    HP       Sector application_label
0        Compressors  0.25   Commercial               cmp
1               Fans  0.25   Industrial               fan
2               Fans   3.0   Commercial               fan
3  Material Handling  15.0  Residential               mat

但是我想对所有字段都这样做,就像我在片段#2中所做的那样。所以我想做点什么:

df['label'] = df.apply(lambda x: '_'.join(labels_dict[column_name][x]), axis=1)

其中列名是要应用函数的df列。有没有办法访问这些信息?

感谢您的帮助!

我将字典定义为:

In [141]: labels_dict
Out[141]:
{u'Application': {u'Compressors': u'cmp',
  u'Fans': u'fan',
  u'Material Handling': u'mat',
  u'Other/General': u'oth',
  u'Pumps': u'pum'},
 u'ECG': {u'Polyphase': u'pol',
  u'Single-Phase (High LRT)': u'sph',
  u'Single-Phase (Low LRT)': u'spl',
  u'Single-Phase (Med LRT)': u'spm'},
 u'Efficiency Level': {u'EL0': u'el0',
  u'EL1': u'el1',
  u'EL2': u'el2',
  u'EL3': u'el3',
  u'EL4': u'el4'},
 u'HP': {0.25: 1.0,
  0.33: 2.0,
  0.5: 3.0,
  0.75: 4.0,
  1.0: 5.0,
  1.5: 6.0,
  2.0: 7.0,
  3.0: 8.0,
  10.0: 9.0,
  15.0: 10.0},
 u'Sector': {u'Commercial': u'com',
  u'Industrial': u'ind',
  u'Residential': u'res'}}

2 个答案:

答案 0 :(得分:1)

我找到了一种方法,但看起来很笨重。我希望那里有更优雅的东西。

df['label'] = pd.DataFrame([df[column_name].apply(lambda x: labels_dict[column_name][x])
    for column_name in df.columns]).apply('_'.join)

答案 1 :(得分:0)

我想说这会更优雅

df.apply(lambda x: '_'.join([str(labels_dict[col][v]) for col, v in zip(df.columns, x)]), axis=1)