所以我在数据框中有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
任何想法怎么做这个操作没有错误?
谢谢, 沫
答案 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)