Pandas 将函数应用于数据框中的特定选定列

Pandas 将函数应用于数据框中的特定选定列,pandas,pandas-apply,Pandas,Pandas Apply,我有以下数据帧: # List of Tuples matrix = [([22, 23], [34, 35, 65], [23, 29, 31]), ([33, 34], [31, 44], [11, 16, 18]), ([44, 56, 76], [16, 34, 76], [21, 34]), ([55, 34], [32, 35, 38], [22, 24, 26]), ([66, 65, 67], [33, 38

我有以下数据帧:

# List of Tuples
matrix = [([22, 23], [34, 35, 65], [23, 29, 31]),
         ([33, 34], [31, 44], [11, 16, 18]),
         ([44, 56, 76], [16, 34, 76], [21, 34]),
         ([55, 34], [32, 35, 38], [22, 24, 26]),
         ([66, 65, 67], [33, 38, 39], [27, 32, 34]),
         ([77, 39, 45], [35, 36, 38], [11, 21, 34])]

# Create a DataFrame object
df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abcdef'))

我可以将我的自定义函数应用于列表中所有列的输出开始项和结束项,如下所示:

def fl(x):
    return [x[0], x[len(x)-1]]

df.apply(lambda x : [fl(i) for i in x])

但我想将该函数应用于选定的x和z列

我试着在下面提到这个

就像这样:

df[['x', 'y']].apply(fl)
如何在函数仅应用于x和z列且y列不变的情况下获得输出。

用于元素处理,也可用于最后一个值使用
[-1]
索引:

def fl(x):
    return [x[0], x[-1]]

df[['x', 'z']] = df[['x', 'z']].applymap(fl) 
print (df)
          x             y         z
a  [22, 23]  [34, 35, 65]  [23, 31]
b  [33, 34]      [31, 44]  [11, 18]
c  [44, 76]  [16, 34, 76]  [21, 34]
d  [55, 34]  [32, 35, 38]  [22, 26]
e  [66, 67]  [33, 38, 39]  [27, 34]
f  [77, 45]  [35, 36, 38]  [11, 34]
或者使用
zip
解决方案,将元组映射到
list
s并通过
str
进行选择:

def fl(x):
    return list(map(list, zip(x.str[0], x.str[-1])))

df[['x', 'z']] = df[['x', 'z']].apply(fl) 
print (df)
          x             y         z
a  [22, 23]  [34, 35, 65]  [23, 31]
b  [33, 34]      [31, 44]  [11, 18]
c  [44, 76]  [16, 34, 76]  [21, 34]
d  [55, 34]  [32, 35, 38]  [22, 26]
e  [66, 67]  [33, 38, 39]  [27, 34]
f  [77, 45]  [35, 36, 38]  [11, 34]

发现我犯的错误

谢谢你的回复

我更改了如下功能:

def fl(x):
    new = []
    for i in x:
        new.append([i[0], i[-1]])
    return new
然后像这样应用函数

df.apply(lambda x : fl(x) if x.name in ['x', 'z'] else x)

然后我就能得到预期的输出。

有没有办法使df.apply(lambda x:fl(x)如果x在['x','y']中,否则x)方法有效?@sharathchandramandadi-因为
x
这里不是列名,而是类似
df['x']
df['y']
df.apply(lambda x : fl(x) if x.name in ['x', 'z'] else x)