如果数据帧的值属于同一区间,则将数据帧的值替换为区间的上界



我有一个数据框架main_df。我已经生成了给定步长为1的半开或半闭区间。数据和代码如下:

mainList= [[0.3, 0.2, 0.2, 0.5, 0.2, 0.3, 0. , 0.2, 0.4, 0.2],
[0.2, 0.1, 0.2, 0.5, 0.2, 0.2, 0. , 0.2, 0.4, 0.1], 
[0.2, 0.1, 0.2, 0.6, 0.2, 0.2, 0. , 0.2, 0.3, 0. ],
[0.2, 0.1, 0.3, 0.6, 0.2, 0.2, 0. , 0.2, 0.2, 0.1],
[0.2, 0.2, 1.2, 0.7, 0.2, 0.2, 0. , 0.2, 0.2, 0. ],
[1.2, 0.1, 0.8, 2.1, 0.2, 0.1, 0. , 0.2, 0.1, 0.1],
[1.3, 0.3, 0.2, 2. , 0.2, 0.2, 0.1, 0.2, 0.1, 0. ], 
[1.3, 0.3, 0.2, 2.2, 0.2, 0.8, 0.2, 0.2, 0.2, 0. ],
[1.2, 0.2, 0.2, 2.6, 0.2, 2. , 0.1, 0.2, 0.6, 0. ],
[1.2, 0.9, 0.2, 3.1, 1.9, 1.6, 0.1, 0.2, 0.5, 0.1]]
main_df = pd.DataFrame(mainList)
val_min = min(main_df.min())
x = np.arange(val_min, val_max, 1)
interval_list = []
if len(x)/2 == 0:
for i in range(0, len(x)):
x1 = list(x[i:i+2])
interval_list.append(x1)

else:
for i in range(0, len(x)-1):
x1 = list(x[i:i+2])
interval_list.append(x1)
half_open_intervalsList = []
for j in interval_list:
k = pd.Interval(j[0], j[1])
half_open_intervalsList.append(k)

半开区间的列表如下:

[(0.0, 1.0], (1.0, 2.0], (2.0, 3.0]]

如果值属于相同的区间,我想用区间的上界替换mainList/main_df的值。请注意,如果mainList中的值不属于这些间隔,则它们保持原样。

我尝试了下面的代码片段,但它没有输出outputList中给出的预期结果。

for ls in mainList:
for m in ls:
sub_list = []
for interval in range(0, len(half_open_intervalsList)):
if m in half_open_intervalsList[interval]:
#print(m)
z = main_df.replace(element, half_open_intervalsList[interval].right)
#sub_list.append(z)
outputList= [[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1],
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1], 
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 0. ],
[1, 1, 1, 1, 1, 1, 0. , 1, 1, 1],
[1, 1, 2, 1, 1, 1, 0. , 1, 1, 0. ],
[2, 1, 1, 3, 1, 1, 0. , 1, 1, 1],
[2, 1, 1, 2 , 1, 1, 1, 1, 1, 0. ], 
[2, 1, 1, 3, 1, 1, 1, 1, 1, 0. ],
[2, 1, 1, 3, 1, 2 , 1, 1, 1, 0. ],
[2, 1, 1, 3.1, 2, 2, 1, 1, 1, 1]]

您可以从半开区间列表中创建一个映射序列,然后使用.apply+map将dataframe中的值与映射序列中的相应值进行映射,最后将NaN值(不能映射的值)填充为原始dataframe中的值:

m = pd.Series([i.right for i in half_open_intervalsList], half_open_intervalsList)
main_df.apply(lambda s: s.map(m)).fillna(main_df)
# OR main_df.stack().map(m).unstack().fillna(main_df)

0    1    2    3    4    5    6    7    8    9
0  1.0  1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  1.0
1  1.0  1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  1.0
2  1.0  1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  0.0
3  1.0  1.0  1.0  1.0  1.0  1.0  0.0  1.0  1.0  1.0
4  1.0  1.0  2.0  1.0  1.0  1.0  0.0  1.0  1.0  0.0
5  2.0  1.0  1.0  3.0  1.0  1.0  0.0  1.0  1.0  1.0
6  2.0  1.0  1.0  2.0  1.0  1.0  1.0  1.0  1.0  0.0
7  2.0  1.0  1.0  3.0  1.0  1.0  1.0  1.0  1.0  0.0
8  2.0  1.0  1.0  3.0  1.0  2.0  1.0  1.0  1.0  0.0
9  2.0  1.0  1.0  3.1  2.0  2.0  1.0  1.0  1.0  1.0

最新更新