如何在 DataFrame 的所有行上应用一个函数
How to apply a function on all rows of a DataFrame
我有如下数据集
data = { "C1": [1.0 , 1.2 , 1.2, 1.30 , 1.29 , 1.30, 1.31] ,
"C2" :[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61] ,
"C3": [1.3 , 1.0 , 1.2 , 1.21 , 1.31 , 1.42 , 1.33] }
data = pd.DataFrame(data)
data = data.T
print(data)
0 1 2 3 4 5 6
Cell 1 1.0 1.2 1.2 1.30 1.29 1.30 1.31
Cell 2 1.2 1.3 1.3 1.40 1.50 1.60 1.61
Cell 3 1.3 1.0 1.2 1.21 1.31 1.42 1.33
我有一个函数可以在数字列表中找到非递减序列。例如,如果您考虑第一行
[1.0 , 1.2 , 1.2, 1.30 , 1.29 , 1.30, 1.31]
有两个非递减序列:
1- [1.0 , 1.2 , 1.2, 1.30] and 2- [1.29 , 1.30, 1.31]
我正在使用以下函数来获取这些非递减序列:
def igroups(x):
s = [0] + [i for i in range(1, len(x)) if x[i] < x[i-1]] + [len(x)]
#print(s)
return [x[j:k] for j, k in [s[i:i+2] for i in range(len(s)-1)] if k - j > 1]
我的问题:我想 apply
在 我的数据框 的所有行上运行 igroups
函数。我怎样才能做到这一点?
我尝试使用 apply
解决这个问题,例如
dt.applymap(lambda x : igroups(x))
我知道 apply
函数适用于单元格而不是一行,最后一行代码不起作用的原因是因为这个,我也知道我可以使用循环解决这个问题(我宁愿不要)。
感兴趣的结果是有一个新列(新),其中包含非递减数字序列列表:
0 1 2 3 4 5 6 7 new
Cell 1 1.0 1.2 1.2 1.30 1.29 1.30 1.31 [[1.0 , 1.2 , 1.2, 1.30 ], [1.29 , 1.30, 1.31]]
Cell 2 1.2 1.3 1.3 1.40 1.50 1.60 1.61 [[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61]]
Cell 3 1.3 1.0 1.2 1.21 1.31 1.42 1.33 [[1.0 , 1.2 , 1.21 , 1.31 , 1.42]]
使用 pandas apply 轴 = 1。它会将函数应用于每一行和 return 一个系列。
df['new'] = df.apply(igroups, axis = 1)
我有如下数据集
data = { "C1": [1.0 , 1.2 , 1.2, 1.30 , 1.29 , 1.30, 1.31] ,
"C2" :[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61] ,
"C3": [1.3 , 1.0 , 1.2 , 1.21 , 1.31 , 1.42 , 1.33] }
data = pd.DataFrame(data)
data = data.T
print(data)
0 1 2 3 4 5 6
Cell 1 1.0 1.2 1.2 1.30 1.29 1.30 1.31
Cell 2 1.2 1.3 1.3 1.40 1.50 1.60 1.61
Cell 3 1.3 1.0 1.2 1.21 1.31 1.42 1.33
我有一个函数可以在数字列表中找到非递减序列。例如,如果您考虑第一行
[1.0 , 1.2 , 1.2, 1.30 , 1.29 , 1.30, 1.31]
有两个非递减序列:
1- [1.0 , 1.2 , 1.2, 1.30] and 2- [1.29 , 1.30, 1.31]
我正在使用以下函数来获取这些非递减序列:
def igroups(x):
s = [0] + [i for i in range(1, len(x)) if x[i] < x[i-1]] + [len(x)]
#print(s)
return [x[j:k] for j, k in [s[i:i+2] for i in range(len(s)-1)] if k - j > 1]
我的问题:我想 apply
在 我的数据框 的所有行上运行 igroups
函数。我怎样才能做到这一点?
我尝试使用 apply
解决这个问题,例如
dt.applymap(lambda x : igroups(x))
我知道 apply
函数适用于单元格而不是一行,最后一行代码不起作用的原因是因为这个,我也知道我可以使用循环解决这个问题(我宁愿不要)。
感兴趣的结果是有一个新列(新),其中包含非递减数字序列列表:
0 1 2 3 4 5 6 7 new
Cell 1 1.0 1.2 1.2 1.30 1.29 1.30 1.31 [[1.0 , 1.2 , 1.2, 1.30 ], [1.29 , 1.30, 1.31]]
Cell 2 1.2 1.3 1.3 1.40 1.50 1.60 1.61 [[1.2 , 1.3 , 1.3 , 1.40 , 1.50 , 1.60 , 1.61]]
Cell 3 1.3 1.0 1.2 1.21 1.31 1.42 1.33 [[1.0 , 1.2 , 1.21 , 1.31 , 1.42]]
使用 pandas apply 轴 = 1。它会将函数应用于每一行和 return 一个系列。
df['new'] = df.apply(igroups, axis = 1)