我有一个数据帧:
import pandas as pd
df = pd.DataFrame({'vals':[2.5, 3, 4, 2.5, 10, 11, 9], 'group':''})
vals group
0 2.5
1 3.0
2 4.0
3 2.5
4 10.0
5 11.0
6 9.0
并希望为每一行分配一个组,其中vals
中的值与函数非常接近(该函数是虚构的,在现实中更复杂,但返回True/False(:
def similar(val1, val2):
if abs(val1-val2)<=3:
return True
else:
return False
因此,第一个值2.5应该与所有值进行比较,如果函数为True,则它们应该得到相同的分组。例如,类似(2.5,3(、类似(2.5、4(、相似(2.5、2.5(都返回True,因此应该对它们进行分组。然后转到10。
创建:
vals group
0 2.5 0
1 3.0 0
2 4.0 0
3 2.5 0
4 10.0 1
5 11.0 1
6 9.0 1
我一直在尝试这样的东西。但我无法让它发挥作用,我想一定有一些更聪明的熊猫方法可以使用一个函数进行分组:
for i in df.index.tolist():
df['group'].iloc[i] = group
v1 = df['vals'].iloc[i]
for j in df.index.tolist()[i+1:]:
print(i,j)
v2 = df['vals'].iloc[j]
if similar(v1, v2):
df['group'].iloc[j] = group
我知道,这不是一个很明确的问题。但我希望至少有人能指出某个方向,这样我就可以在谷歌上搜索。。。
我对值进行排序,然后用上一个值检查.diff((,然后用.gt((检查这个diff是否大于max_distance:
import pandas as pd
df = pd.DataFrame({'vals':[2.5, 3, 4, 2.5, 10, 11, 9, 30]})
df = df.sort_values(by='vals')
max_distance = 3
df['group'] = (df
.diff()
.gt(max_distance)
.cumsum()
)
结果数据帧:
vals group
0 2.5 0
1 3.0 0
2 4.0 0
3 2.5 0
4 10.0 1
5 11.0 1
6 9.0 1
7 30.0 2
另请参阅以获得类似的答案:
Python-pandas-如何对封闭元素进行分组