2014-12-04 83 views
0

所以我有一个数据框中的5列,我喜欢合并为现有列中的列表。数据框的子集低于:在同一个熊猫中的一个新列中合并几列DataFrame

  loclize_indices_region i1 i2  i3  i4   i5 
survey ID                 
59988455      NaN CIS NaN  NaN  NaN   NaN 
59988455      NaN CIS NaN  NaN  NaN Main Indices 
59988455      NaN CIS NaN  NaN  NaN   NaN 
59988455      NaN NaN NaN Europe America Main Indices 
59988455      NaN NaN NaN  NaN  NaN   NaN 
59988455      NaN CIS APAC Europe  NaN   NaN 
59988455      NaN CIS NaN  NaN  NaN   NaN 
59988455      NaN CIS NaN  NaN  NaN Main Indices 
59988455      NaN NaN NaN  NaN  NaN   NaN 
59988455      NaN NaN APAC  NaN  NaN Main Indices 
59988455      NaN CIS NaN Europe America   NaN 
59988455      NaN NaN NaN  NaN  NaN Main Indices 
59988455      NaN CIS NaN  NaN  NaN   NaN 

我后是通过合并列(I1,I2,I3,I4,I5),以填补'loclize_indices_region'列,而不NaN创建列表。下面的最终结果应该什么样子:

survey ID     loclize_indices_region 
59988455          [CIS] 
59988455      [CIS, Main Indices] 
59988455          [CIS] 
59988455   [Europe, America, Main Indices] 
59988455           [] 
59988455      [CIS, APAC, Europe] 
59988455          [CIS] 
59988455      [CIS, Main Indices] 
59988455           [] 
59988455      [APAC, Main Indices] 
59988455      [CIS, Europe, America] 
59988455        [Main Indices] 

下面的代码完全正常,但我需要建立一个功能,将做到这一点对我来说,而不是列的每个块,我想合并创建的lambda函数。 (我仍然有我想申请对他们同样的逻辑其他类似的栏目。)

data['loclize_indices_region'] = data.apply(lambda x: [x['i1'], x['i2'], x['i3'], x['i4'], x['i5']], axis=1) 
data['loclize_indices_region'] = data.loclize_indices_region.map(lambda x: [i for i in x if str(i) != 'nan'], 1) 

我试着写下面的函数,打算data.apply()使用,但由于某种原因它不工作:

def merge_cols(series, *cols): 
    list = [series[i] for i in cols] 
    list = [ l for l in list if l !='nan'] 
    return list 

list [i1, i2, i3, i4, i5] 

data['loclize_indices_region'] = data.apply(merge_cols(*list), 1) 

我得到下面的错误,而不是

Traceback (most recent call last): 
    File "C:/Users/u8003461/SkyDrive/Python/Eikon Russian Survey/data_discovery.py", line 26, in <module> 
    list [i1, i2, i3, i4, i5] 
NameError: name 'i1' is not defined 

任何想法如何做免费这个操作错误?

感谢, 莫

回答

1

假设dfsurvey ID是可以做到这一点在一行中的索引你的数据框:

df['loclize_indices_region'] = df.loc[:,df.columns.tolist()[1:]].apply(lambda x: x.dropna().tolist(), 1) 

或单独提供列的列表:

cols = ['i1', ... ,'i5'] 
df['loclize_indices_region'] = df.loc[:,cols].apply(lambda x: x.dropna().tolist(), 1) 

请注意,列名是字符串,所以i1应该是'i1'列在你的列表中。

,或者,如果你必须使用外部功能:@Primer

def merge_cols(x, cols): 
    return x.loc(axis=1)[cols].dropna().tolist() 

cols = df.columns.tolist()[1:] 

df['loclize_indices_region'] = df.apply(merge_cols, cols=cols, axis=1) 
+0

感谢您的帮助,它精美的作品。你会介意使用'df.loc'吗?它在上面的代码中究竟扮演什么角色? – mobaset 2014-12-07 06:04:13

+0

建议使用'.loc'属性作为基于主标签的访问方法,以避免链接分配出现问题。因此,即使需求可能不像上述虚拟示例中那样明显(这是我想的习惯问题),使用它也没有什么坏处。您可以在[官方文档](http://pandas.pydata.org/pandas-docs/stable/indexing.html#selection-by-label)中找到关于它的更多信息,包括不使用'时的示例。 loc'会给你一个问题。 – Primer 2014-12-07 07:40:53

相关问题