将函数应用于 pandas 数据框中的特定选定列
Apply function to specific selected columns in pandas data frame
我有以下数据框:
# 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。
我正在尝试参考这个 link
df.apply(lambda x: fl(x) if x in ['x', 'y'] else x)
像这样:
df[['x', 'y']].apply(fl)
如何通过仅应用于 x 和 z 列的函数获得输出,而 y 列保持不变。
使用 DataFrame.applymap
进行逐元素处理,对于最后一个值也可以使用 [-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]
或者对于 DataFrame.apply
的解决方案,使用 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)
然后我就能得到预期的输出。
我有以下数据框:
# 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。
我正在尝试参考这个 link
df.apply(lambda x: fl(x) if x in ['x', 'y'] else x)
像这样:
df[['x', 'y']].apply(fl)
如何通过仅应用于 x 和 z 列的函数获得输出,而 y 列保持不变。
使用 DataFrame.applymap
进行逐元素处理,对于最后一个值也可以使用 [-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]
或者对于 DataFrame.apply
的解决方案,使用 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)
然后我就能得到预期的输出。