在同一个pandas DataFrame中的一个新列中合并多个列

时间:2014-12-04 10:40:11

标签: python pandas merge dataframe

所以我在数据框中有5列,我喜欢合并为现有列中的列表。数据框的子集如下:

           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 个答案:

答案 0 :(得分:1)

假设df是您的DataFrame且survey 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'

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

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)